所以,我得到了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?
例如说我有一个密码财产,我不希望任何人能够发布这些信息。
我使用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的罐子在你的类路径。
你可以选择在任何实现org.springframework.http.converter.xml只要你考虑各自的要求包装。
你可以告诉一个什么类型的,将通过RequestMapping注释的消耗属性消耗的方法。
IE从Spring文档:
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
注:这是一个逗号分隔的列表,所以你也可以拥有应用程序/ xml的为好。
需要注意的还有,这将只接受那些内容类型,它给你一点安全的,但可能会导致意想不到的结果。 我的意思是,如果你发送/pets
text / plain的,该方法将不会被调用。
要做到正确的绑定,检查通过发送的内容类型HttpServletRequest
和反编组取决于你正在处理的是什么类型。
(回答这个即使它很老万一有人遇到这种在网站搜索) -您可以使用ContentNegotiationViewResolver http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/ mvc.html#MVC-多表示
我用这一个来处理两个:
@RequestMapping(value = "/{id}",
method = RequestMethod.GET,
headers ={"Accept=application/json,application/xml"},
produces={"application/json", "application/xml"})