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

回到顶部