XML Wildfly/Primefaces 上的货币符号中断了部分响应
XML Partial-Response breaks with Currency Symbol on Wildfly/Primefaces
当请求的响应中包含货币符号(在本例中为“£”)时,我遇到了损坏的 XML。
我做了很多测试,并将其缩小到在 XML 中使用“£”,这会以某种方式导致结束标记不完整,这当然会导致无法解析 XML,例如:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="productForm">
<![CDATA[
<form enctype="application/x-www-form-urlencoded">
<div>
<span>
<span id="productForm:price">£10.00</span>
</span>
</div>
</form>]]>
</update>
</changes>
</partial-response
这是由于损坏的(不是拼写错误)partial-response
结束标记造成的,正如在开发控制台中确认的那样:
£
的存在是原因,正如调试和测试所确定的那样。
以下是我可以做出的一些断言:
- 受影响的代码在 Java 7/Glassfish 3
上运行良好
- 相同的代码不适用于 Java 8/Wildfly 17 除非
£
符号被遗漏,此时它是 BAU
已尝试货币符号:
<f:convertNumber type="currency" locale="en_GB" currencyCode="GBP"/>
<f:convertNumber type="currency" locale="en_GB" currencySymbol="£"/>
所有这些都失败了。
<f:convertNumber type="currency" locale="en_GB" pattern="0.00"/>
没有,但显然因为它没有以 £
结尾
删除 XHTML 模板的所有其余部分并简单地添加 <p>£</p>
也会使它变得乏味。
我看不到任何导致此问题的明显原因 - 我也无法确定它是应用程序服务器问题还是应用程序配置问题。它已经在 *NIX 环境中进行了测试,没有任何迹象表明它在这方面是环境的。
这里有什么明显的遗漏吗?我能看到的所有编码都设置为UTF-8,所以我被这个难住了,通过搜索找不到其他类似的情况。
提前感谢您的任何建议
经过进一步调查,发现这是 @WebFilter
.
的(未确定的)结果
Web 过滤器实现拦截了输出字符串中的某些值,尽管实际上没有更改请求的内容,尤其是在调试器中,但这似乎会导致响应进一步出现问题。
网络过滤器中代码的问题区域是:
servletResponse.setContentLength( filteredContent.length() );
我没有写有问题的 class,我怀疑它可能是 'template code',但这种属性的重新设置似乎导致的问题远比它解决的问题多。删除它解决了这个问题。看起来 servlet 能够自行处理此属性(至少等待更多测试)。
当请求的响应中包含货币符号(在本例中为“£”)时,我遇到了损坏的 XML。
我做了很多测试,并将其缩小到在 XML 中使用“£”,这会以某种方式导致结束标记不完整,这当然会导致无法解析 XML,例如:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="productForm">
<![CDATA[
<form enctype="application/x-www-form-urlencoded">
<div>
<span>
<span id="productForm:price">£10.00</span>
</span>
</div>
</form>]]>
</update>
</changes>
</partial-response
这是由于损坏的(不是拼写错误)partial-response
结束标记造成的,正如在开发控制台中确认的那样:
£
的存在是原因,正如调试和测试所确定的那样。
以下是我可以做出的一些断言:
- 受影响的代码在 Java 7/Glassfish 3 上运行良好
- 相同的代码不适用于 Java 8/Wildfly 17 除非
£
符号被遗漏,此时它是 BAU 已尝试货币符号:
<f:convertNumber type="currency" locale="en_GB" currencyCode="GBP"/>
<f:convertNumber type="currency" locale="en_GB" currencySymbol="£"/>
所有这些都失败了。<f:convertNumber type="currency" locale="en_GB" pattern="0.00"/>
没有,但显然因为它没有以£
结尾
删除 XHTML 模板的所有其余部分并简单地添加
<p>£</p>
也会使它变得乏味。
我看不到任何导致此问题的明显原因 - 我也无法确定它是应用程序服务器问题还是应用程序配置问题。它已经在 *NIX 环境中进行了测试,没有任何迹象表明它在这方面是环境的。
这里有什么明显的遗漏吗?我能看到的所有编码都设置为UTF-8,所以我被这个难住了,通过搜索找不到其他类似的情况。
提前感谢您的任何建议
经过进一步调查,发现这是 @WebFilter
.
Web 过滤器实现拦截了输出字符串中的某些值,尽管实际上没有更改请求的内容,尤其是在调试器中,但这似乎会导致响应进一步出现问题。
网络过滤器中代码的问题区域是:
servletResponse.setContentLength( filteredContent.length() );
我没有写有问题的 class,我怀疑它可能是 'template code',但这种属性的重新设置似乎导致的问题远比它解决的问题多。删除它解决了这个问题。看起来 servlet 能够自行处理此属性(至少等待更多测试)。