设置Spring MVC中的REST风格的端点,对于JSON和XML(Setting up Spri

2019-08-05 00:38发布

所以,我得到了JSON的工作如果有人可以张贴JSON形式的对象,我的控制器方法是映射到实际的java对象。 我的Spring配置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?

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

Answer 1:

我使用Spring 3.1,这是我正在做的。 在调度员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 (杰克逊)和/或@XStreamOmitField (对于XStream的)。

请确保您有杰克逊和XStream的罐子在你的类路径。



Answer 2:

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



Answer 3:

你可以告诉一个什么类型的,将通过RequestMapping注释的消耗属性消耗的方法。

IE从Spring文档:

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

注:这是一个逗号分隔的列表,所以你也可以拥有应用程序/ xml的为好。

需要注意的还有,这将只接受那些内容类型,它给你一点安全的,但可能会导致意想不到的结果。 我的意思是,如果你发送/pets text / plain的,该方法将不会被调用。

要做到正确的绑定,检查通过发送的内容类型HttpServletRequest和反编组取决于你正在处理的是什么类型。



Answer 4:

(回答这个即使它很老万一有人遇到这种在网站搜索) -您可以使用ContentNegotiationViewResolver http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/ mvc.html#MVC-多表示



Answer 5:

我用这一个来处理两个:

@RequestMapping(value = "/{id}", 
method = RequestMethod.GET,
headers ={"Accept=application/json,application/xml"},
produces={"application/json", "application/xml"})


文章来源: Setting up Spring MVC for restful endpoints, for both json and xml