CXF 当消息体很大时拦截器获取得到的xml输出报文可能是空的
这种情况一般是因为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>
``
原文地址: https://www.cveoy.top/t/topic/hrzd 著作权归作者所有。请勿转载和采集!