CXF soap message 协议从 1.1 转为 1.2

在使用CXF开发WebService时,若遇到需要调用使用SOAP1.2协议的服务,文章提供了三种解决方案:1) 修改接口或实现定义为SOAP1.2;2) 使用SOAPHandler转换消息,适用于JDK环境;3) 利用JaxWsProxyFactoryBean创建SOAP1.2消息。

使用cxf开发 webservice的时候,因为cxf只支持 1.1 的消息,但是自己的服务调用别人的服务往往需要采用别人的协议版本,如果别人的webservice 服务的实现使用的是 1.2 的协议,那么这时候存在以下几种解决方案。

1 在webservice接口或实现处定义 SOAP12 的协议 

   这种方案实现的前提是你能看到并修改别人定义的代码。

@WebService
@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING)
public class ConvergaFileUploadServiceImpl implements FileUploadService {}

2 使用 SOAPHandler 来处理消息

   这种方案的策略是将发送过来的消息从11转为12 ,但是有个前提,这种转法只支持 jdk 

  

    @Bean("documentUploadServiceJaxwsClient2")
    @Lazy
    public JaxWsPortProxyFactoryBean jaxWsPortProxyFactoryBean2() {
        JaxWsPortProxyFactoryBean jaxWsPortProxyFactoryBean = new JaxWsPortProxyFactoryBean();
        jaxWsPortProxyFactoryBean.setServiceInterface(org.tempuri.IDocumentUploadService.class);
        jaxWsPortProxyFactoryBean.setNamespaceUri("http://tempuri.org/");
        jaxWsPortProxyFactoryBean.setServiceName("DocumentUploadService");
        jaxWsPortProxyFactoryBean.setPortName("secureBinding");
        jaxWsPortProxyFactoryBean.setEndpointAddress(endpointAddress);
        jaxWsPortProxyFactoryBean.setCustomProperties(proxyProperties);

        DefaultHandlerResolver defaultHandlerResolver = new DefaultHandlerResolver();
        defaultHandlerResolver.setHandlerList(Arrays.asList(new RequestHandler()));
        jaxWsPortProxyFactoryBean.setHandlerResolver(defaultHandlerResolver);
        return jaxWsPortProxyFactoryBean;
    }
/**
 * Request Handler to convert SOAP 1.1 Request to SOAP 1.2 (since CONVERGA is hosted as SOAP1.2 service) 
 * and currently JaxWsPortProxyFactoryBean does not provides support for consuming SOAP 1.2 messages.
 * @author aadm063
 *
 */
public class RequestHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Logger LOG = Logger.getLogger(RequestHandler.class.getName());
    
    public boolean handleMessage(SOAPMessageContext context) {
        
        Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (Boolean.TRUE.equals(outbound)) {
            
            LOG.info("Request message intercepted while invoking converga.");
            
            try {
                
                LOG.fine("Creating soap 1.2 message from converga request.");
                SOAPMessage soapMessage = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
                soapMessage.getSOAPBody().appendChild(context.getMessage().getSOAPBody().getFirstChild());
                
                context.setMessage(soapMessage); 
                
                if (LOG.isLoggable(Level.INFO)) {
                    String body = getBody(context.getMessage());
                    LOG.fine(body);
                }
               
            } 
            catch (Exception ex) {
                LOG.log(Level.SEVERE, "Error Occured while invoking CONVERGA", ex);
            }
        } else {
            
            LOG.info("Response message received from converga.");
            if (LOG.isLoggable(Level.INFO)) {
                try {
                    String body = getBody(context.getMessage());
                    LOG.fine(body);
                } 
                catch (Exception ex) {
                    LOG.log(Level.SEVERE, "An Error Occured while printing response body.", ex);
                }
            }
        }
       
        return true;
    }
    

    /**
     * Helper Method to convert SOAPMessage to String.
     * 
     * @param message
     * @return
     * @throws SOAPException
     * @throws IOException
     */
    private String getBody(SOAPMessage message) throws SOAPException, IOException {
        OutputStream stream = new ByteArrayOutputStream();
        message.writeTo(stream);
        return stream.toString();
    }


    public void close(MessageContext arg0) {
        //Do nothing with messageContext
    }


    public boolean handleFault(SOAPMessageContext arg0) {
        return true;
    }


    public Set<QName> getHeaders() {
        return new HashSet<>();
    }

}

3 使用 JaxWsProxyFactoryBean 来构建 SOAP 12 的消息

@Configuration
public class ServiceConfig {

    @Value("${documentUpload.documentUploadURL}")
    private String endpointAddress;

    @Value("#{${documentUpload.proxyProperties}}")
    private Map<String,Object> proxyProperties;

    @Bean("documentUploadServiceJaxwsClient")
    @Lazy
    public IDocumentUploadService jaxWsPortProxyFactoryBean() {
        JaxWsProxyFactoryBean jobFactory = new JaxWsProxyFactoryBean();
        jobFactory.setServiceName(QName.valueOf("DocumentUploadService"));
        jobFactory.setServiceClass(org.tempuri.IDocumentUploadService.class);
        jobFactory.setAddress(endpointAddress);
        jobFactory.setProperties(proxyProperties);
        SoapBindingConfiguration config = new SoapBindingConfiguration();
        Soap12 sv = Soap12.getInstance();
        config.setVersion(sv);
        jobFactory.setBindingId(SoapBindingConstants.SOAP12_BINDING_ID);
        jobFactory.setBindingConfig(config);

        //jobFactory.setHandlers(Arrays.asList(new RequestHandler()));
        return (IDocumentUploadService)jobFactory.create();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值