GSP中messages.properties文本替换PDF导出XML解析异常求助
解决GSP导出PDF时因&特殊字符触发SAXParseException的问题
这个问题我之前帮人排查过,本质是XML解析的严格规则和消息文本里的未转义特殊字符冲突了——当你导出PDF时,生成工具大概率是把GSP渲染后的内容当作XML(比如XSL-FO格式)来处理,而XML里&是预定义实体的开头,必须紧跟合法的实体名(比如&),单独出现的&会直接触发解析异常。下面给你几个靠谱的解决办法:
方法1:直接在messages.properties中转义特殊字符
这是最直接的方案,把messages.properties里的&替换成XML实体&就行。比如:
- 原内容:
info.text=Apple & Banana - 修改后:
info.text=Apple & Banana
这样<g:message>标签取出的内容就是XML安全的,PDF生成工具解析时不会报错;同时网页显示时,浏览器会自动把&还原成&,完全不影响前端展示效果。
方法2:通过Grails标签/工具类动态转义
如果不想修改messages.properties(比如内容是动态生成的,或者需要兼容多场景),可以在GSP里对<g:message>的输出做XML转义:
方案2.1 使用encodeAs标签(Grails 3+适用)
直接给<g:message>加上encodeAs="XML"属性,让Grails自动处理转义:
<g:message code="${code}" locale="${locale}" encodeAs="XML"/>
方案2.2 使用StringEscapeUtils工具类
如果是Grails 2.x版本,可以借助Apache Commons Lang的工具类手动转义,记得用raw()标签避免GSP二次转义:
${raw(org.apache.commons.lang.StringEscapeUtils.escapeXml(message(code: code, locale: locale)))}
方法3:调整PDF生成工具的解析规则(不推荐)
部分PDF生成工具(比如Flying Saucer)支持设置宽松的XML解析模式,允许未转义的&存在。但这种方法属于“绕过问题”而非“解决问题”,会增加后续维护风险,比如遇到其他XML特殊字符(<、>等)还是会报错,所以优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Kshitij Bajracharya
相关产品推荐
相关产品推荐

