日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Spring MVC –揭秘了@RequestBody和@ResponseBody

發布時間:2023/12/3 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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發出給我們的資源,而這些請求基本上是開箱即用的。

  • PUT /bookcase Content-Type: text/csv "123","Spring in Action" "456","Clean Code"Response 204 No Content
  • GET /bookcase Accept: text/csvResponse 200 OK "123","Spring in Action" "456","Clean Code"
  • 得益于遵循單責任原則的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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。