Axis2 error: Invalid white space character (0x4) in text to output

Axis2 error: Invalid white space character (0x4) in text to output

我创建了一个 Java 客户端来与使用 Axis2 (1.7.6) 作为代码生成器的 SOAP 网络服务进行交互。问题是一些输入客户端抛出异常消息:

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 的内部。

关于如何 fix/configure 客户端正确的任何想法?

经过一些研究,我发现此行为是由于 lib Woodstox(Axis2 依赖项)的一个默认设置所致,该设置使用 class 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 中的 class com.ctc.wstx.stax.WstxOutputFactory 包含多个配置,其中之一是无效字符处理程序。但是,它不能通过某些魔术系统范围 属性 配置,而是通过方法 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.

大功告成!