任何人都知道在 Spring Web 服务中实际调用解组的类是什么?我想知道在肥皂迭代器中调用 un/marshalling 是否有效/必要。或者是否有更合适的拦截器来处理端点周围的未编组对象?如果是,我仍然想知道它在内部是如何工作的。
谢谢。
编辑
其实我用的org.springframework.ws.server.EndpointInterceptor
更准确。
任何人都知道在 Spring Web 服务中实际调用解组的类是什么?我想知道在肥皂迭代器中调用 un/marshalling 是否有效/必要。或者是否有更合适的拦截器来处理端点周围的未编组对象?如果是,我仍然想知道它在内部是如何工作的。
谢谢。
编辑
其实我用的org.springframework.ws.server.EndpointInterceptor
更准确。
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>
希望这可以帮助。
MethodArgumentResolver的实现负责将请求负载映射到适当的格式(xml 文档、Dom4j、Jaxb 等),这发生在调用端点之前。拦截器仅获取原始 xml 源(javax.xml.transorm.Source)。
如果您想在拦截器中解组原始 xml,那么您将必须获取对解组器的引用并自己执行此操作,似乎没有任何EndpointInterceptor的孩子可以为您提供解组的内容(考虑到它可以解组为许多不同的格式)。