这种情况一般是因为CXF默认使用了Stax方式来处理XML消息,而Stax是基于事件的方式来读取XML消息,当消息体很大时,可能会出现事件丢失的情况,导致拦截器获取不到完整的XML消息。

解决方法可以尝试使用DOM方式来处理XML消息,可以通过配置CXF中的InInterceptor和OutInterceptor来实现:

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        try {
            // 使用DOM方式获取XML消息
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(message.getContent(InputStream.class));
            // 处理XML消息
            // ...
            // 将修改后的XML消息写回到输入流中
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer transformer = tfactory.newTransformer();
            StreamResult result = new StreamResult(message.getContent(OutputStream.class));
            DOMSource source = new DOMSource(doc);
            transformer.transform(source, result);
        } catch (Exception e) {
            throw new Fault(e);
        }
    }

}

然后在CXF的配置文件中配置InInterceptor和OutInterceptor:

<jaxws:endpoint id="myService"
                implementor="com.example.MyServiceImpl"
                address="/MyService">
    <jaxws:inInterceptors>
        <bean class="com.example.MyInterceptor"/>
    </jaxws:inInterceptors>
    <jaxws:outInterceptors>
        <bean class="com.example.MyInterceptor"/>
    </jaxws:outInterceptors>
</jaxws:endpoint>
``
CXF 当消息体很大时拦截器获取得到的xml输出报文可能是空的

原文地址: https://www.cveoy.top/t/topic/hrzd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录