【发布时间】:2011-02-23 08:13:48
【问题描述】:
我正在通过 Spring 配置一个 RESTful Web 服务,具有各种表示形式,包括 JSON。我希望接口是对称的,这意味着通过 GET 序列化为 JSON 的对象的格式也是 POST/PUT 可以接受的格式。不幸的是,我只能让 GET 工作。
这是我发送和接收 JSON 的配置,它由 JSON 消息转换器和视图组成:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</util:list>
</property>
</bean>
<bean id="contentNegotiatingViewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<util:map>
<entry key="json" value="application/json"/>
</util:map>
</property>
<property name="defaultViews">
<util:list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
</util:list>
</property>
</bean>
当我使用 GET 访问控制器以返回对象(例如 Book)时,它会输出类似这样的内容。
{"book":{"isbn":"1234","author":"Leo Tolstoy","title":"War and Peace"}}
如果我转身通过 POST 或 PUT 重新提交一些类似的 JSON,Spring 无法使用它,抱怨 Unrecognized field "book" (Class com.mycompany.Book), not marked as ignorable。此外,如果我去掉“书”包装元素(我宁愿不这样做,只是想看看会发生什么),我会收到 400 BAD REQUEST。无论哪种情况,我的控制器代码都不会被命中。
这是我的控制器 - 我宁愿在这里没有任何特定于 JSON 的代码(或者我的类上的注释被编组/解组),因为它们将有多种表示形式 - 我想使用 Spring 的解耦 MVC 基础架构来推动那种东西(编组/查看解析/等)到配置文件中:
@RequestMapping(method=PUT, value="/books/{isbn}")
@ResponseStatus(NO_CONTENT)
public void saveBook(@RequestBody Book book, @PathVariable String isbn) {
book.setIsbn(isbn);
bookService.saveBook(book)
}
@RequestMapping(method=GET, value="/books/{isbn}")
public ModelAndView getBook(@PathVariable String isbn) {
return new ModelAndView("books/show", "book", bookService.getBook(isbn));
}
【问题讨论】:
标签: java json spring spring-mvc marshalling