使用SpringWS使用SOAPV1.2而不是默认的v1.1生成SOAP Web服务

使用SpringWS使用SOAPV1.2而不是默认的v1.1生成SOAP Web服务,soap,spring-ws,soapserver,Soap,Spring Ws,Soapserver,我目前正在从事SpringSOAP服务器项目。我从Spring的入门指南开始构建一个基本的SOAP服务 默认的SOAP协议是SOAPV1.1。有没有办法将协议设置为v1.2,可能是通过注释 我在@Endpoint类上尝试了@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP\u BINDING)注释,但它似乎不起作用 我还尝试了@Endpoint(value=SOAPBinding.SOAP12HTTP\u BINDING)来设置它,但正如启

我目前正在从事SpringSOAP服务器项目。我从Spring的入门指南开始构建一个基本的SOAP服务

默认的SOAP协议是SOAPV1.1。有没有办法将协议设置为v1.2,可能是通过注释

我在
@Endpoint
类上尝试了
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP\u BINDING)
注释,但它似乎不起作用

我还尝试了
@Endpoint(value=SOAPBinding.SOAP12HTTP\u BINDING)
来设置它,但正如启动时的日志所示,这也不起作用

INFO --- [nio-8080-exec-1] o.s.ws.soap.saaj.SaajSoapMessageFactory  :
 Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
当然,如果我向服务器发送SOAP请求,我会得到以下错误

2015-01-19 15:50:17.610 ERROR 20172 --- [nio-8080-exec-1] c.sun.xml.internal.messaging.saaj.soap : SAAJ0533: Cannot create message: incorrect content-type for SOAP version. Got application/soap+xml;
 charset=utf-8, but expected text/xml
2015-01-19 15:50:17.611 ERROR 20172 --- [nio-8080-exec-1] c.sun.xml.internal.messaging.saaj.soap   :
 SAAJ0535: Unable to internalize message
2015-01-19 15:50:17.617 ERROR 20172 --- [nio-8080-exec-1] a.c.c.C.[.[.[.[messageDispatcherServlet] :
 Servlet.service() for servlet [messageDispatcherServlet] in context with path [] threw exception [R
equest processing failed; nested exception is org.springframework.ws.soap.SoapMessageCreationException: Could not create message from InputStream: Unable to internalize message; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to internalize message] with root cause

com.sun.xml.internal.messaging.saaj.soap.SOAPVersionMismatchException: Cannot create message: incorrect content-type for SOAP version. Got: application/soap+xml; charset=utf-8 Expected: text/xml
        at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.init(Unknown Source)
        at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.<init>(Unknown Source)
        at com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.<init>(Unknown Source)
        at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(Unknown Source)
2015-01-19 15:50:17.610错误20172---[nio-8080-exec-1]c.sun.xml.internal.messaging.saaj.soap:SAAJ0533:无法创建消息:soap版本的内容类型不正确。Got应用程序/soap+xml;
charset=utf-8,但应为text/xml
2015-01-19 15:50:17.611错误20172---[nio-8080-exec-1]c.sun.xml.internal.messaging.saaj.soap:
SAAJ0535:无法内部化消息
2015-01-19 15:50:17.617错误20172---[nio-8080-exec-1]a.c.c.c.[messageDispatcherServlet]:
路径为[]的上下文中Servlet[messageDispatcherServlet]的Servlet.service()引发异常[R]
请求处理失败;嵌套异常为org.springframework.ws.soap.SoapMessageCreationException:无法从InputStream创建消息:无法内部化消息;嵌套异常为com.sun.xml.internal.messaaj.SOAPExceptionImpl:无法内部化消息],具有根本原因
com.sun.xml.internal.messaging.saaj.soap.SOAPVersionMismatchException:无法创建消息:soap版本的内容类型不正确。Get:应用程序/soap+xml;字符集=utf-8应为:text/xml
位于com.sun.xml.internal.messaging.saaj.soap.MessageImpl.init(未知源)
位于com.sun.xml.internal.messaging.saaj.soap.MessageImpl.(未知来源)
位于com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.(未知来源)
位于com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(未知源)
感谢您的帮助


谢谢!

您将Spring WS与来自JAX-WS(package
javax.xml.WS
)的注释混合在一起。这不起作用。要将Spring WS配置为使用SOAP 1.2,请添加以下bean定义:

@Bean
public SaajSoapMessageFactory messageFactory() {
    SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
    messageFactory.setSoapVersion(SoapVersion.SOAP_12);
    return messageFactory;
}

如果messageFactory Bean不在singleton范围内,则不会在Bean实例上调用SaajSoapMessageFactory中的AfterPropertieSet()方法

AfterPropertieSet()方法设置内部消息工厂。因此,如果messageFactory bean有自己的作用域,则需要按如下方式设置内部消息工厂:

@Bean
@范围(“自定义范围”)
公共SaajSoapMessageFactory messageFactory(){
SaajSoapMessageFactory messageFactory=新的SaajSoapMessageFactory();
messageFactory.messageFactory=messageFactory.newInstance(SOAPConstants.SOAP\u 1\u 2\u协议);
返回工厂;
}
messageFactory()@Bean是一个必要的步骤,但是添加它不是很重要吗

wsdl11Definition.setCreateSoap12Binding(true); 
到服务定义,生成适当的soap 1.2绑定


无论如何,感谢Andreas Veithen

这只是一个可能会引起一些人注意的简短说明,消息工厂应该被声明为一个单独的bean(使用
@bean
),因为它一直在这里。如果您手动构建它,它将无法工作,因为它依赖于Spring生命周期方法
afterPropertiesSet()
被调用来构建内部消息工厂。这是一个有点奇怪的设计,可能会让您感到惊讶。我这样做,但当spring boot启动时,我仍然得到o.s.w.s.saaj.SaajSoapMessageFactory.AfterPropertieSet-使用SOAP 1.1创建saaj 1.3消息工厂Protocol@Andreas-请你在这里回答:?@kenny,这是什么意思s您注册该bean失败。请确保该bean注册为messageFactory名称,正如此答案中的方法名称所示。您还可以选择像so
@bean(name=DEFAULT\u MESSAGE\u FACTORY\u bean\u name)那样注册该bean
。在注册
messageDispatcherServlet
时,还要确保您没有以某种方式更改默认的消息工厂名称。
messageDispatcherServlet
有一个方法
setMessageFactoryBeanName()
,如果您没有使用此处设置的名称注册
MessageFactory
实例,则会出现此错误。希望这对其他人有所帮助。