0

我是 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 调用的情况下,我可以将它用作返回的模型对象。

4

1 回答 1

1

您需要设置请求的内容类型,并且不需要echoDto=

curl -H "Content-Type: application/xml" -d "<EchoDto><message>adrian</message></EchoDto>" http://localhost:8001/foo/rest/echo/echoByPost.xml
于 2012-06-30T05:16:57.717 回答