我正在通过Spring配置RESTful Web服务,并使用各种表示形式(包括JSON)。我希望接口是对称的,这意味着通过GET序列化为JSON的对象的格式也是POST/PUT可以接受的格式。不幸的是,我只能让GETs工作。使用Spring MVC 3.0生成/消费对称JSON
这是我的用于发送和接收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":{"isbn":"1234","author":"Leo Tolstoy","title":"War and Peace"}}
如果我转身,并通过POST重新提交一些类似的JSON或PUT,春都不能消耗它,抱怨Unrecognized field "book" (Class com.mycompany.Book), not marked as ignorable
。此外,如果我剥离“书籍”包装元素(我宁愿不要,但只是为了看看会发生什么),我会得到一个400 BAD REQUEST。无论哪种情况,我的控制器代码都不会被击中。
这里是我的控制器 - 我宁愿没有任何特定于JSON的代码(或者我的类上的注释被编组/解组),因为它们将具有多个表示形式 - 我想使用Spring的解耦MVC基础结构来推动这种类型事情(编组/视图解决的/ etc。)到配置文件:
@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));
}
MappingJackson2JsonView具有属性extractValueFromSingleKeyModel。当它设置为true时,它的行为与您的SimpleJacksonJsonView完全相同。 – Felix 2013-10-15 15:43:38
在这个问题的时候,我认为财产不存在。谢谢! – SingleShot 2013-10-17 04:11:01