我是 Spring MVC(Spring 3)和 REST 的新手,我正在尝试一个小玩具应用程序来尝试 GET 和 POST Web 服务。我已经阅读了 Spring 的官方参考资料,并在 Stackoverflow、REST 应用程序的 RequestBody、在 Spring MVC 3中传递请求参数中找到了这些问题,但我仍然坚持让它工作。谁能给我提示我错过了什么?
我的控制器是这样的:
@Controller
@RequestMapping(value = "/echo")
public class EchoControllerImpl implements EchoController {
@RequestMapping(method = RequestMethod.POST, value = "/echoByPost")
public ModelAndView echoByPost(@ModelAttribute EchoDto input) {
// ...
}
}
我已经在应用程序ctx中放置了相应的转换器:
<mvc:annotation-driven />
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" >
<property name="classesToBeBound">
<list>
<value>foo.EchoDto</value>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="marshallingHttpMessageConverter" />
<ref bean="stringHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean id="marshallingHttpMessageConverter"
class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxb2Marshaller" />
<property name="unmarshaller" ref="jaxb2Marshaller" />
</bean>
<!-- other beans like ViewResolvers -->
我什至尝试将这些添加到 web.xml,因为我看到某处提到它(尽管我真的不知道它是什么意思)
<filter>
<filter-name>httpPutFormFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpPutFormFilter</filter-name>
<servlet-name>spring-rest</servlet-name>
</filter-mapping>
然后我尝试通过 Curl 调用我的 Web 服务:
curl -d "echoDto=<EchoDto><message>adrian</message></EchoDto>" http://localhost:8001/foo/rest/echo/echoByPost.xml
我发现我的传入对象不是通过解组 JAXB2 创建的。相反,似乎调用了包含整个请求 xml 消息的 ctor EchoDto(String)。
(我也尝试用 @RequestBody 注释参数,但更糟糕的是,我什至无法调用控制器方法)
有人可以告诉我我错过了什么吗?
Jaxb2Marshaller 使用 DTO 类正确设置,因为在另一个 GET REST webserivce 调用的情况下,我可以将它用作返回的模型对象。