所以我让json工作,有人可以用json格式发布一个对象,我的控制器方法将它映射到实际的java对象。我的spring config 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?e.g。说我有密码属性,我不希望任何人能够发布这些信息。
答案 0 :(得分: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>
在Controller中,
@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)。
确保您的班级路径中有杰克逊和XStream罐。
答案 1 :(得分:0)
只要您考虑相应的要求,就可以在org.springframework.http.converter.xml包中选择任何实现。
答案 2 :(得分:0)
您可以通过RequestMapping注释的consumes属性告诉方法它将使用哪种类型。
即。来自Spring文档:
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
注意:这是一个以逗号分隔的列表,因此您也可以使用application / xml。
重要的是要注意,这只会接受那些内容类型,它们会给你一个
有点安全,但可能会导致意想不到的结果。我的意思是,如果您发送/pets
text / plain,则不会调用该方法。
要进行正确的绑定,请检查通过HttpServletRequest
发送的内容类型,并根据您正在处理的类型进行解组。
答案 3 :(得分:0)
(即使它已经很老了,以防万一有人在网站搜索中遇到这个问题) - 您可以使用ContentNegotiationViewResolver http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-multiple-representations
答案 4 :(得分:0)
我正在使用这个来处理两者:
@RequestMapping(value = "/{id}",
method = RequestMethod.GET,
headers ={"Accept=application/json,application/xml"},
produces={"application/json", "application/xml"})