我正在通過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