1

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

谢谢。

编辑

其实我用的org.springframework.ws.server.EndpointInterceptor更准确。

4

2 回答 2

2

AbstractMarshallingPayloadEndpoint是将请求负载解组为对象并将响应对象编组为 XML 的 Endpoint,查看其 invoke() 方法源代码

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 中,所有 marshaler 类都实现 Marshaller 和 Unmarshaller 接口,为 OXM 编组提供一站式解决方案,例如Jaxb2Marshaller,因此在 applicationContext 中连接您的 AbstractMarshallingPayloadEndpoint 实现,如下所示:

<bean id="myMarshallingPayloadEndpoint"
    class="com.example.webservice.MyMarshallingPayloadEndpoint">
    <property name="marshaller" ref="marshaller" />
    <property name="unmarshaller" ref="marshaller" />
    ... ...
</bean>

希望这可以帮助。

于 2012-07-16T04:15:59.670 回答
1

MethodArgumentResolver的实现负责将请求负载映射到适当的格式(xml 文档、Dom4j、Jaxb 等),这发生在调用端点之前。拦截器仅获取原始 xml 源(javax.xml.transorm.Source)。

如果您想在拦截器中解组原始 xml,那么您将必须获取对解组器的引用并自己执行此操作,似乎没有任何EndpointInterceptor的孩子可以为您提供解组的内容(考虑到它可以解组为许多不同的格式)。

于 2012-07-16T00:30:35.000 回答