我对SOAP端点有一个特定的需求。我们在我的组织中使用spring 2.4.0框架。
我们真正需要的是一个获取SOAP消息本身并返回一个字符串的端点。消息有效负载是XML数据。我们需要做的一切都可以使用MessageContext对象来完成。我们不需要解组XML之类的。
我一直在做一些实验,但最后总是出现以下错误:
No adapter for endpoint [public java.lang.String org.company.endpoint.MyEndpoint.receiveSOAP(org.springframework.ws.context.MessageContext) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
我现在可能有大量不必要的配置破坏了我的Spring框架。因此,任何想法,我如何能够做到这一点,以最小的配置:
最好跳过XML->POJO转换,因为有效负载XML是巨大的
发布于 2016-12-21 15:32:04
您可以通过使用DomPoxMessageFactory和您自己编写的MessageEndpoint的简单实现来实现这一点。如下所示:
@Override
public void invoke(MessageContext messageContext) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
messageContext.getRequest().writeTo(out);
String message = out.toString();
...
}
您的spring配置将包含:
<bean id="messageReceiver" class="com.yourcompany.MessageReceiver"/>
<bean id="messageFactory" class="org.springframework.ws.pox.dom.DomPoxMessageFactory">
</bean>
<!-- Register PayloadRootAnnotationMethodEndpointMapping -->
<bean class="org.springframework.ws.server.endpoint.mapping.SimpleMethodEndpointMapping">
<property name="interceptors">
<list>
<ref bean="loggingInterceptor"/>
</list>
</property>
<property name="defaultEndpoint" ref="fileReceiver"/>
<property name="endpoints">
<list>
<ref bean="fileReceiver"/>
</list>
</property>
</bean>
<bean id="endpointAdapter" class="org.springframework.ws.server.endpoint.adapter.MessageEndpointAdapter"/>
<bean id="loggingInterceptor" class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor">
</bean>
<bean id="handlerAdapter" class="org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter">
<property name="messageFactory" ref="messageFactory"/>
</bean>
<bean id="wsdlName" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schema" ref="schema"/>
<property name="portTypeName" value="MyInterface"/>
<property name="locationUri" value="/ws/somepath/"/>
<property name="targetNamespace" value="http://test.yourcompany.com/" />
<property name="createSoap12Binding" value="true" />
<property name="createSoap11Binding" value="false" />
</bean>
<bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema">
<property name="xsd" value="WEB-INF/schema.xsd"/>
</bean>
在端点中获得的消息字符串将包含整个XML,包括SOAP信封等。如果您只想要消息体,请执行
messageContext.getRequest().getPayloadSource()
您将获得有效负载的DOM源,在其中可以查找包含消息内容的节点。(第一个子节点是信封,该节点的索引3处的子节点是主体。)
https://stackoverflow.com/questions/41221056
复制相似问题