Axis2 错误:要输出的文本中的空白字符 (0x4) 无效

cri*_*oms 2 java soap axis2 web-services webservice-client

我创建了一个 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 的内部。

关于如何正确修复/配置客户端的任何想法?

cri*_*oms 5

经过一些研究,我发现这种行为是由于 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它而不是抛出错误会将这些字符替换为其他东西。但是怎么做呢?

com.ctc.wstx.stax.WstxOutputFactoryWoodstox 中的类包含多个配置,其中之一是无效字符处理程序。但是,它不能通过一些魔法系统范围的属性进行配置,而是通过将com.ctc.wstx.stax.WstxOutputFactory#setProperty一个字符串和一个对象作为参数的方法进行配置。

因此,首先,您必须扩展该工厂并使用一个实例设置属性com.ctc.wstx.outputInvalidCharHandler,该实例com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler将要替换无效字符的字符作为参数。像这样:

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(' '));
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个最棘手且未记录的步骤是如何将您的实现注册为 Woodstox 将使用的工厂。您必须创建一个META-INF/services/javax.xml.stream.XMLOutputFactory仅包含工厂名称的文件,在本例中为字符串:

my.package.MyWstxOutputFatory
Run Code Online (Sandbox Code Playgroud)

以包含在项目生成的 jar 中的方式放置此文件。在我来说,我喜欢放置:src/main/resources/META-INF/services/javax.xml.stream.XMLOutputFactory

你完成了!