2011-10-17 48 views
1

我正在使用spring-ws作为web服务,并且似乎无法弄清楚如何针对相同的初始请求返回不同的响应。让我们只是说我得到了某种类型的请求,我们将其称为FindGasRequest。现在我已经正确设置了端点映射,这样当一个FindGasRequest进入时,它映射到正确的端点,然后执行一些业务逻辑,然后返回一个FindGasResponse。spring-ws返回不同类型

这是我的问题。假设我得到一个FindGasRequest,然后在我的业务逻辑中,我确定不是返回一个FindGasResponse,而是想返回一个ListGasStationsResponse。如果我的@PayloadRoot标记的方法期望FindGasResponse,我该如何做到这一点?我猜如何将有效载荷更改为其他内容?

我有错误检查设置,使我可以抛出一个异常,它会通过和异常处理程序返回FindGasErrorResponse。所以我的第一个想法是做类似的事情,但在没有错误发生时抛出一个异常似乎很棘手。

+0

在java中这似乎很简单,问题是,你有一些XSD其下应该反映结构。最好我可以想出(根据您的例子)是始终返回一个列表,因为列表可以包含1个或多个FindGasResponse元素。 – evandongen

回答

2

酱,

假设你的消息模式及合同与客户端允许响应FindGasRequest返回ListGasStationsResponse或FindGasResponse,你需要放弃基于注解FindGas终点,而是让你的终点扩展AbstractMarshallingPayloadEndpoint。

您应该然后覆盖AbstractMarshallingPayloadEndpoint.invokeInternal返回两个不同的响应类型为对象之一。然后,您的编组(这对我的作品与Jaxb2Marshaller)应自动能够采取的对象,并为这些类型的一个XML响应。

请注意,您可能会混合使用基于注释的和xml配置的端点,在这种情况下,您应该按照此处的说明为它们设置映射:http://forum.springsource.org/showthread.php?78685-Mixing-annotations-with-xml-configuration-of-endpoints

这种方法在Spring-WS 1.5中适用于我。

+0

像魅力一样工作! – sauce