Я настраиваю веб-сервис RESTful через Spring с различными представлениями, включая JSON.Я хочу, чтобы интерфейс был симметричным, то есть формат объекта, сериализованного в JSON через GET, также является форматом, который может принять 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>
Когда я нажимаю на контроллер сПОЛУЧИТЬ вернуть объект, например, книгу, он выводит что-то вроде этого.
{"book":{"isbn":"1234","author":"Leo Tolstoy","title":"War and Peace"}}
Если я оборачиваюсь и повторно отправляю какой-то похожий JSON через POST или PUT, Spring не может его использовать, жалуясьоколо Unrecognized field "book" (Class com.mycompany.Book), not marked as ignorable
.Кроме того, если я уберу элемент обертки «book» (я бы предпочел, но не для того, чтобы посмотреть, что произойдет), я получу 400 BAD REQUEST.В любом случае мой код контроллера никогда не срабатывает.
Вот мой контроллер - я бы предпочел, чтобы здесь не было никакого кода, специфичного для JSON (или аннотации на мои классы, маршалируемые / не маршалируемые), поскольку они будут иметь несколько представлений- Я хочу использовать несвязанную инфраструктуру MVC Spring, которая помещает такие вещи (сортировка / разрешение представления / и т. Д.) В файлы конфигурации:
@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));
}