我有一个Spring WS客户端。我通过wsimport生成了WSDL存根。
当我尝试发送请求时,我收到一个无效的内容类型异常:
严重:SAAJ0537:内容类型无效。可能是错误消息而不是SOAP消息 线程“main”中的异常org.springframework.ws.soap.SoapMessageCreationException:无法从InputStream创建消息:Invalid Content-Type:text / html。这是一条错误消息而不是SOAP响应吗?嵌套异常是com.sun.xml.messaging.saaj.SOAPExceptionImpl:无效的内容类型:text / html。这是一条错误消息而不是SOAP响应吗?
这是否表示我发送的邮件内容类型无效或我收到的回复内容类型无效?如果是在客户端,我该如何设置内容类型?
我尝试通过Soap UI模拟Web服务。我能够发送和接收正确的回复。
编辑:
在我的日志中,显示请求已发送:
DEBUG [org.springframework.ws.client.MessageTracing.sent] - 已发送请求
然后我得到了那个例外:
线程“main”中的异常org.springframework.ws.soap.SoapMessageCreationException:
答案 0 :(得分:5)
问题解决了。
事实证明我没有发送任何SOAP内容。 SOAP标头设置正确。但是SOAP主体是空的。要解决此问题,我必须附上我要求的内容。
在:
GetDeletedRequest request = new GetDeletedRequest();
JAXBElement res = (JAXBElement) webServiceTemplate.marshalSendAndReceive(request, new WebServiceMessageCallback() {...}
后:
GetDeletedRequest request = new GetDeletedRequest();
request.setGetDeletedFilter(deleteFilter); // This is the content that I'm missing!
JAXBElement res = (JAXBElement) webServiceTemplate.marshalSendAndReceive(request, new WebServiceMessageCallback() {...}
我忽略了这个错误,因为我专注于将AXIS 1.x客户端实现移植到Spring WS实现中。
有些人,包括Arjen Poustma,建议使用tcpmon来嗅探发送的内容。我没有设法正确配置和运行它(这是另一个不相关的问题)。但这让我有了一个想法,就是先检查我的应用程序发送了什么。
我环顾四周,在Spring论坛中看到了WS Client using JAXB for marshalling中无效内容类型的类似问题。最后一张海报建议使用CommonsHttpMessageSender,就像他在Web Service Client with Spring-WS提供的例子(这是一个很好的例子)。使用CommonsHttpMessageSender,它能够打印出我的整个SOAP信封:
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender" />
</property>
我在这里记录我的经历,因为我知道有一天会有另外一个像我这样的人会遇到同样的问题。