参考:https://blog.csdn.net/yczz/article/details/16809859#commentBox
http://cxf.apache.org/docs/interceptors.html
https://elim.iteye.com/blog/2248620#_Toc431737707
cxf 可以对请求和发送时的报文进行拦截,然后对其进行加工成我们想要的格式,然后再放到回去!!!!!
我实现的是自定义拦截器
1.在需要拦截的方法上面加上这个注解,注解里面是我们的自定义拦截器
@OutInterceptors(interceptors = { "com.deloitte.tms.vat.webservice.result1.CDATAOutInterceptor" })
@InInterceptors(interceptors="com.deloitte.tms.vat.webservice.result1.ArtifactOutInterceptor")
2.对返回时的格式进行拦截实例,如果
public CDATAOutInterceptor() {
//这里代表流关闭之前的阶段,这很重要!可以到官网去看,拦截的阶段分为很多种 super(Phase.PRE_STREAM); }
Phase.PRE_STREAM写的阶段不对可能会对想要的结果有影响,我开始写的Send和Write都是不生效的,网上也有好多博文写的是这种!!!踩到坑了!
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.cxf.helpers.IOUtils; import org.apache.cxf.io.CachedOutputStream; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class CDATAOutInterceptor extends AbstractPhaseInterceptor<Message> { private static final Logger log = LogManager.getLogger(ArtifactOutInterceptor.class); public CDATAOutInterceptor() {
//这里代表流关闭之前的阶段,这很重要!可以到官网去看,拦截的阶段分为很多种 super(Phase.PRE_STREAM); } @Override public void handleMessage(Message message) { /*这里是通过注解的方式来加<!CDATA[[]]>的格式 * message.put("disable.outputstream.optimization", Boolean.TRUE); * XMLStreamWriter writer = * StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class * )); message.setContent(XMLStreamWriter.class, new * CDATAXMLStreamWriter(writer)); */ try { OutputStream os = message.getContent(OutputStream.