>我创建了一个Java客户端,使用Axis2(1.7.6)作为代码生成器与SOAP Web服务进行交互。问题在于某些输入客户端抛出
异常并显示消息:org.apache.axis2.AxisFault: Invalid white space character (0x4) in text to output (in xml 1.1, could output as a character entity)
序列化程序似乎遇到了一些被认为对 XML 规范无效的字符。我已经看到了这个问题,但没有明确的答案或修复。我没有使用 Spring 或任何其他依赖注入框架,它是一个独立的应用程序,所以我需要手动配置 Axis2 的内部。
关于如何正确修复/配置客户端的任何想法?
经过一些研究,我发现这种行为是由于lib Woodstox(Axis2依赖项)的一个默认设置,该设置使用类com.ctc.wstx.api.InvalidCharHandler.FailingHandler
作为接口的默认实现com.ctc.wstx.api.InvalidCharHandler
,在com.ctc.wstx.sw.XmlWriter
内部使用并在序列化过程中调用。这意味着:当组件命中被认为对 XML 无效的字符时,它将抛出错误。
Woodstox提供了接口com.ctc.wstx.api.InvalidCharHandler
的另一个实现,称为com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler
,而不是抛出错误,而是将这些字符替换为其他内容。但是怎么做呢?
Woodstox内部的类com.ctc.wstx.stax.WstxOutputFactory
包含多个配置,其中一个是无效的char处理程序。虽然,它不能通过一些神奇的系统范围属性进行配置,而是通过方法com.ctc.wstx.stax.WstxOutputFactory#setProperty
,该方法将一个字符串和一个对象作为参数。
因此,首先,您必须扩展该工厂并使用com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler
实例设置属性com.ctc.wstx.outputInvalidCharHandler,该实例将要替换无效字符的字符作为参数。喜欢这个:
package my.package;
import com.ctc.wstx.stax.WstxOutputFactory;
public class MyWstxOutputFatory extends WstxOutputFactory {
public MyWstxOutputFatory() {
setProperty(
com.ctc.wstx.api.WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER,
new com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler(' '));
}
}
第二个最棘手且未记录的步骤是如何将您的实现注册为 Woodstox 将使用的工厂。您必须创建一个名为META-INF/services/javax.xml.stream.XMLOutputFactory
的文件,该文件仅包含工厂名称,在本例中为字符串:
my.package.MyWstxOutputFatory
以包含在项目生成的 jar 中的方式放置此文件。就我而言,我放置了这样的:src/main/resources/META-INF/services/javax.xml.stream.XMLOutputFactory
.
大功告成!