0

我在接收 XML 作为输入的 Web 服务中使用 Spring。它可以是嵌入在 HTTP 请求中的 XML,也可以是请求属性中的纯文本。

目前,我的 Web 服务正在处理两种不同的 XML 模式,因此我的解组器可以将 XML 文件解组为两种对象类型(例如:Foo 和 Bar)。

在我的控制器中,我有下一个代码来处理请求属性:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=application/x-www-form-urlencoded"})
@ResponseBody
public ResponseObject getResponse(@RequestParam("request") String request, HttpServletRequest req) {

它完美地工作,我可以将请求字符串解组为 Foo 对象或 Bar 对象。

问题来自于 XML 嵌入:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=text/xml"})
@ResponseBody
public ResponseObject getResponse(@RequestBody Foo request, HttpServletRequest req) {

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=text/xml"})
@ResponseBody
public ResponseObject getResponse(@RequestBody Bar request, HttpServletRequest req) {

这是消息转换器:

<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="jaxb2Marshaller" />
    <property name="unmarshaller" ref="jaxb2Marshaller" />
</bean>
<oxm:jaxb2-marshaller id="jaxb2Marshaller" contextPath="path.to.Foo:path.to.Bar"/>

我认为 MessageConverter 应该自动解组,但我收到下一个错误:

java.lang.IllegalStateException: 为 HTTP 路径“/ws/mypath.ws”映射的不明确的处理程序方法:[...] 如果您打算在多个方法中处理相同的路径,那么将它们分解到一个专用的处理程序类中在类型级别映射的路径!

如何自动解组为不同的@RequestBody对象类型?(具有相同的Web 服务路径

4

1 回答 1

0

必须有一些东西@RequestMapping使每个请求方法都是唯一的,在您的情况下,两个基于 xml 的请求映射完全相同 - 在框架找到正确的方法后,参数的类型将被计算出来@RequestMapping。所以基本上你所说的是不可行的,除非你在注释中有更多的东西来帮助框架找到正确的方法。

如果您使用的是 Spring 3.1+,您可以进行的一个小简化如下:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, consumes=text/xml)
于 2013-01-08T12:49:53.070 回答