Spring WS:什么类调用unmarshalling?

时间:2012-07-15 22:03:07

标签: java web-services spring jaxb2

任何人都知道什么类实际上在春季网络服务中调用解组?我想知道在soap iterceptor中调用un / marshalling是否有效/必要。或者是否有更合适的拦截器用于处理端点周围的未编组对象?如果是,我仍然想知道它是如何在内部工作的。

感谢。

修改

实际上我使用org.springframework.ws.server.EndpointInterceptor更准确。

2 个答案:

答案 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源(ja​​vax.xml.transorm.Source)。

如果你想在拦截器中解组原始xml,那么你必须得到一个unmarshaller的引用并自己这样做,似乎没有EndpointInterceptor的任何子代可以为你提供一个未编组的内容(考虑到它可以解组为这么多不同的格式)。