javascript
Spring MVC –揭秘了@RequestBody和@ResponseBody
在這篇文章中,我想對Spring MVC進行一些深入的探討,以揭示將請求轉換為參數對象后在幕后發生的情況,反之亦然。 在開始之前,我想解釋這些注釋的目的。
@RequestBody和@ResponseBody是做什么用的?
它們是spring mvc框架的注釋,可用于控制器中以實現智能對象序列化和反序列化。 通過提取消息轉換的邏輯并將其作為一個方面,它們可幫助您避免樣板代碼。 除此之外,它們還幫助您為單個REST資源支持多種格式,而無需重復代碼。 如果您使用@ResponseBody注釋方法,spring將嘗試轉換其返回值并將其自動寫入http響應。 如果使用@RequestBody注釋方法參數,spring會嘗試將傳入請求主體的內容即時轉換為參數對象。
這是一個例子
@Controller @RequestMapping(value = "/bookcase") public class BookCaseController {private BookCase bookCase;@RequestMapping(method = RequestMethod.GET)@ResponseBodypublic BookCase getBookCase() {return this.bookCase;}@RequestMapping(method = RequestMethod.PUT)@ResponseStatus(HttpStatus.NO_CONTENT)public void setBookCase(@RequestBody BookCase bookCase) {this.bookCase = bookCase;}}那么,當我們使用這些注釋時,Spring在后臺做了什么?
根據您的配置,spring在后臺注冊了HttpMessageConverters列表。 HttpMessageConverters的職責是根據預定義的mime類型將請求正文轉換為特定類,然后再次轉換為響應正文。 每當發出的請求命中@RequestBody或@ResponseBody批注時,spring都會循環遍歷所有已注冊的HttpMessageConverters,以尋找適合給定mime類型和類的第一個,然后將其用于實際轉換。
如何添加自定義HttpMessageConverter?
通過分別添加@EnableWebMvc <mvc:annotation-driven />,spring為JSON / XML注冊了一堆預定義的消息轉換器,等等。 您可以添加如下的自定義轉換器
@Configuration @EnableWebMvc @ComponentScan public class WebConfiguration extends WebMvcConfigurerAdapter {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {httpMessageConverters.add(new BookCaseMessageConverter(new MediaType("text", "csv")));} }在此示例中,我編寫了一個轉換器,用于處理BookCase的轉換,而BookCase基本上是一本Books List。 轉換器能夠將csv內容轉換為BookCase,反之亦然。 我使用opencsv解析文本。
這是模型
public class Book {private String isbn;private String title;public Book(String isbn, String title) {this.isbn = isbn;this.title = title;}// ... }public class BookCase extends ArrayList<Book> {public BookCase() {}public BookCase(Collection<? extends Book> c) {super(c);} }和實際的轉換器
public class BookCaseMessageConverter extends AbstractHttpMessageConverter<BookCase> {public BookCaseMessageConverter() {}public BookCaseMessageConverter(MediaType supportedMediaType) {super(supportedMediaType);}public BookCaseMessageConverter(MediaType... supportedMediaTypes) {super(supportedMediaTypes);}@Overrideprotected boolean supports(Class<?> clazz) {return BookCase.class.equals(clazz);}@Overrideprotected BookCase readInternal(Class<? extends BookCase> clazz, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {CSVReader reader = new CSVReader(new InputStreamReader(httpInputMessage.getBody()));List<String[]> rows = reader.readAll();BookCase bookCase = new BookCase();for (String[] row : rows) {bookCase.add(new Book(row[0], row[1]));}return bookCase;}@Overrideprotected void writeInternal(BookCase books, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {CSVWriter writer = new CSVWriter(new OutputStreamWriter(httpOutputMessage.getBody()));for (Book book : books) {writer.writeNext(new String[]{book.getIsbn(), book.getTitle()});}writer.close();} }結果
現在,我們可以將text / csv請求以及application / json和xml發出給我們的資源,而這些請求基本上是開箱即用的。
得益于遵循單責任原則的spring mvc設計,我們的控制器保持纖薄。 如果我們要支持新的媒體類型,則不必添加一行。
完整的示例可以在我的github上找到
參考: Spring MVC –在Be Be a Better Developer博客上, JCG合作伙伴 Gregor Riegler 揭露了@RequestBody和@ResponseBody的神秘面紗 。翻譯自: https://www.javacodegeeks.com/2013/07/spring-mvc-requestbody-and-responsebody-demystified.html
總結
以上是生活随笔為你收集整理的Spring MVC –揭秘了@RequestBody和@ResponseBody的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么修笔记本电脑 电脑坏了怎么修
- 下一篇: 菩提萨婆诃是什么意思 菩提萨婆诃含义