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

被折叠的 条评论
为什么被折叠?



