歡迎光臨
每天分享高質量文章

Spring Boot:定製type Formatters

考慮到PropertyEditor的無狀態和非執行緒安全特性,Spring 3增加了一個Formatter接口來替代它。Formatters提供和PropertyEditor類似的功能,但是提供執行緒安全特性,並且專註於完成字串和物件型別的互相轉換。

假設在我們的程式中,需要根據一本書的ISBN字串得到對應的book物件。通過這個型別格式化工具,我們可以在控制器的方法簽名中定義Book引數,而URL引數只需要包含ISBN號和資料庫ID。

How Do

  • 首先在專案根目錄下創建formatters

  • 然後創建BookFormatter,它實現了Formatter接口,實現兩個函式:parse用於將字串ISBN轉換成book物件;print用於將book物件轉換成該book對應的ISBN字串。

  1. package com.test.bookpub.formatters;

  2. import com.test.bookpub.domain.Book;

  3. import com.test.bookpub.repository.BookRepository;

  4. import org.springframework.format.Formatter;

  5. import java.text.ParseException;

  6. import java.util.Locale;

  7. public class BookFormatter implements Formatter<Book> {

  8.    private BookRepository repository;

  9.    public BookFormatter(BookRepository repository) {

  10.        this.repository = repository;

  11.    }

  12.    @Override

  13.    public Book parse(String bookIdentifier, Locale locale) throws ParseException {

  14.        Book book = repository.findBookByIsbn(bookIdentifier);

  15.        return book != null ? book : repository.findOne(Long.valueOf(bookIdentifier));

  16.    }

  17.    @Override

  18.    public String print(Book book, Locale locale) {

  19.        return book.getIsbn();

  20.    }

  21. }

  • 在WebConfiguration中添加我們定義的formatter,重寫(@Override修飾)addFormatter(FormatterRegistry registry)函式。

  1. @Autowired

  2. private BookRepository bookRepository;

  3. @Override

  4. public void addFormatters(FormatterRegistry registry) {

  5.    registry.addFormatter(new BookFormatter(bookRepository));

  6. }

  • 最後,需要在BookController中新加一個函式getReviewers,根據一本書的ISBN號獲取該書的審閱人。

  1. @RequestMapping(value = "/{isbn}/reviewers", method = RequestMethod.GET)

  2. public List<Reviewer> getReviewers(@PathVariable("isbn") Book book) {

  3.    return book.getReviewers();

  4. }

  • 通過 mvn spring-boot:run運行程式

  • 通過httpie訪問URL——http://localhost:8080/books/9781-1234-1111/reviewers,得到的結果如下:

  1. HTTP/1.1 200 OK

  2. Content-Type: application/json;charset=UTF-8

  3. Date: Tue, 08 Dec 2015 08:15:31 GMT

  4. Server: Apache-Coyote/1.1

  5. Transfer-Encoding: chunked

  6. []

分析

Formatter工具的標的是提供跟PropertyEditor類似的功能。通過FormatterRegistry將我們自己的formtter註冊到系統中,然後Spring會自動完成文本表示的book和book物體物件之間的互相轉換。由於Formatter是無狀態的,因此不需要為每個請求都執行註冊formatter的動作。

使用建議:如果需要通用型別的轉換——例如String或Boolean,最好使用PropertyEditor完成,因為這種需求可能不是全域性需要的,只是某個Controller的定製功能需求。

我們在WebConfiguration中引入(@Autowired)了BookRepository(需要用它創建BookFormatter實體),Spring給配置檔案提供了使用其他bean物件的能力。Spring本身會確保BookRepository先創建,然後在WebConfiguration類的創建過程中引入。

赞(0)

分享創造快樂

© 2021 知識星球   网站地图