任何人都知道什么类实际上在春季网络服务中调用解组?我想知道在soap iterceptor中调用un / marshalling是否有效/必要。或者是否有更合适的拦截器用于处理端点周围的未编组对象?如果是,我仍然想知道它是如何在内部工作的。
感谢。
修改
实际上我使用org.springframework.ws.server.EndpointInterceptor
更准确。
答案 0 :(得分:2)
AbstractMarshallingPayloadEndpoint是将请求有效负载解组到对象中并将响应对象编组为XML的端点,请查看its invoke() method source code:
public final void invoke(MessageContext messageContext) throws Exception {
WebServiceMessage request = messageContext.getRequest();
Object requestObject = unmarshalRequest(request);
if (onUnmarshalRequest(messageContext, requestObject)) {
Object responseObject = invokeInternal(requestObject);
if (responseObject != null) {
WebServiceMessage response = messageContext.getResponse();
marshalResponse(responseObject, response);
onMarshalResponse(messageContext, requestObject, responseObject);
}
}
}
AbstractMarshallingPayloadEndpoint需要对XML封送程序的引用:
- Castor XML:org.springframework.oxm.castor.CastorMarshaller
- JAXB v1:org.springframework.oxm.jaxb.Jaxb1Marshaller
- JAXB v2:org.springframework.oxm.jaxb.Jaxb2Marshaller
- JiBX:org.springframework.oxm.jibx.JibxMarshaller
- XMLBeans:org.springframework.oxm.xmlbeans.XmlBeansMarshaller
- XStream:org.springframework.oxm.xstream.XStreamMarshaller
请注意,在Spring-OXM中,所有封送程序类都实现了Marshaller和Unmarshaller接口,以便为OXM封送提供一站式解决方案,例如Jaxb2Marshaller,因此在applicationContext中连接您的AbstractMarshallingPayloadEndpoint实现,如下所示: / p>
<bean id="myMarshallingPayloadEndpoint"
class="com.example.webservice.MyMarshallingPayloadEndpoint">
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
... ...
</bean>
希望这有帮助。
答案 1 :(得分:1)
MethodArgumentResolver的实现负责将请求有效负载映射到适当的格式(xml Document,Dom4j,Jaxb等),这恰好在调用端点之前发生。拦截器只获取原始xml源(javax.xml.transorm.Source)。
如果你想在拦截器中解组原始xml,那么你必须得到一个unmarshaller的引用并自己这样做,似乎没有EndpointInterceptor的任何子代可以为你提供一个未编组的内容(考虑到它可以解组为这么多不同的格式)。