2

所以我让json工作,有人可以以json形式发布一个对象,我的控制器方法将它映射到实际的java对象。我的弹簧配置 xml 看起来像:

 <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="jsonMessageConverter"/>
            </util:list>
        </property>
    </bean>

一个有效的测试控制器方法如下:

    @ResponseBody
    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String create(@RequestBody User user, HttpServletRequest request, HttpServletResponse response) {

        return user.getName();
    }

现在,如果我也想要完全相同的方法来处理 xml,这可能吗?我使用哪个消息转换器?

顺便说一句,如果我想保留某些私有属性,我该怎么做才能同时适用于 json 和 xml?

例如说我有一个密码属性,我不希望任何人能够发布这些信息。

4

5 回答 5

2

我正在使用 Spring 3.1,这就是我正在做的事情。在 dispatcher-servelet.xml

   <bean id="jacksonObjectMapper" class="com.parth.web.CustomJacksonMapper"/>
    <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
        <props>
            <prop key="event">com.parth.model.Event</prop>
        </props>
        </property>
        <property name="annotatedClasses">
        <list>
            <value>com.parth.model.Event</value>
        </list>
    </property>
    </bean>

    <oxm:jaxb2-marshaller id="jaxb2Marshaller">
        <oxm:class-to-be-bound name="com.parth.model.Event"/>
    </oxm:jaxb2-marshaller>

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter" p:marshaller-ref="xstreamMarshaller" p:unmarshaller-ref="xstreamMarshaller"/>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" p:objectMapper-ref="jacksonObjectMapper" />
        </mvc:message-converters>
    </mvc:annotation-driven>

在控制器中,

@RequestMapping(value="/",method= RequestMethod.GET)
    @ResponseBody
    public List<Event> getAllEvents(@RequestParam("userId")  String userId, HttpServletResponse response){
        return  eventService.getAll(userId);
    }

现在,当您从客户端发出 HTTP 请求时,请确保您Accept使用appliction/json or application/xml.

至于省略字段,您可以使用注释@JsonIgnore(对于 Jackson)和/或@XStreamOmitField(对于 XStream)。

确保你的类路径中有 Jackson 和 XStream jar。

于 2012-12-31T14:39:24.340 回答
0

您可以通过 RequestMapping 注解的 consumes 属性告诉一个方法它将使用什么类型。

来自 Spring 文档的 IE:

@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")

注意:这是一个逗号分隔的列表,因此您也可以拥有 application/xml。

同样重要的是要注意,这只会接受那些内容类型,这会给你一点安全,但可能会导致意想不到的结果。我的意思是,如果您发送/petstext/plain,则不会调用该方法。

要进行正确的绑定,请检查通过HttpServletRequest和 unmarshal 发送的内容类型,具体取决于您正在处理的类型。

于 2012-12-31T15:00:46.387 回答
0

只要您考虑各自的要求,您就可以在org.springframework.http.converter.xml包中选择任何实现。

于 2012-12-29T16:03:20.180 回答
0

(即使它很旧,也可以回答这个问题,以防有人在网站搜索中遇到这个问题) - 您可以使用 ContentNegotiationViewResolver http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/ mvc.html#mvc-multiple-representations

于 2013-06-10T21:22:31.527 回答
0

我正在使用这个来处理两者:

@RequestMapping(value = "/{id}", 
method = RequestMethod.GET,
headers ={"Accept=application/json,application/xml"},
produces={"application/json", "application/xml"})
于 2014-08-26T21:45:09.567 回答