Spring REST 3支持XML和JSON
如果我们使用Spring MVC开发REST,它将支持XML和JSON数据。我已经在我的spring config
bean中写了ContentNegotiationViewResorverapp-servlet.xml
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"
p:order="1">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"
p:autodetectAnnotations="true" />
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
我的springREST控制器是:
@Controller@RequestMapping("/rest/customers")
class CustomerRestController {
protected Log log = LogFactory.getLog(CustomerRestController.class);
@RequestMapping(method = POST)
@ResponseStatus(CREATED)
public void createCustomer(@RequestBody Customer customer,
HttpServletResponse response) {
log.info(">>>" + customer.getName());
response.setHeader("Location", String.format("/rest/customers/%s",
customer.getNumber()));
}
@RequestMapping(value = "/{id}", method = GET)
@ResponseBody
public Customer showCustomer(@PathVariable String id) {
Customer c = new Customer("0001", "teddy", "bean");
return c;
}
@RequestMapping(value = "/{id}", method = PUT)
@ResponseStatus(OK)
public void updateCustomer(@RequestBody Customer customer) {
log.info("customer: " + customer.getName());
}
我@XStreamAlias("customer")
在客户域类中设置了注释。但是,当我尝试访问http://localhost:8080/rest/customers/teddy.xml
它时,它总是响应JSON数据。
我@XmlRootElement(name="customer")
在客户域类中设置了注释。但是,当我尝试访问http://localhost:8080/rest/customers/teddy.json
它时,它总是响应XML数据。
有什么不对 ?
回答:
我认为“ xml”内容类型应映射到“ text / xml”而不是“ application /
xml”。另外,要强制基于扩展名的内容类型解析器,您可以尝试将“ ContentNegotiatingViewResolver”的“
favorPathExtension”属性设置为true(尽管默认情况下应为true!)
编辑:我现在在此GIT位置添加了一个工作示例- git://github.com/bijukunjummen/mvc-
samples.git如果您使用mvn tomcat:run调出端点,则json在http://localhost:8080/mvc-
samples/rest/customers/teddy.jsonxml处提供http://localhost:8080/mvc-
samples/rest/customers/teddy.xml。正如我熟悉的JAXB一样,它使用JAXB2而不是XStream。我注意到的一件事是,当客户类中的JAXB批注不正确时,一旦我修复了我的客户,Spring就会以您看到的方式提供JSON而不是XML(您可以通过从Customer类中删除XMLRootElement批注来复制它)。注解,我按预期获得了XML。
编辑2:你是对的!我没有注意到,一旦我获得xml,我就认为json现在可以工作了。我看到的问题是AnnotationMethodHandlerAdapter
,的处理@ResponseBody
有点奇怪,它完全忽略了ViewResolvers,而是使用注册的MessageConverters而不是完全绕过ContentNegotiatingViewResolver
,目前的一种解决方法是使用@ModelAttribute
注释进行响应,而不是@ResponseBody,这样查看解析器正在被调用。现在尝试使用位于的项目,git@github.com:bijukunjummen/mvc-
samples.git看看它是否适合您。这可能是Spring的错误,您可以尝试在Spring论坛中提出它,并查看他们的建议。
以上是 Spring REST 3支持XML和JSON 的全部内容, 来源链接: utcz.com/qa/397372.html