本文首發於我的網站:Spring Boot實戰之定製type Formattersjava
前面咱們有篇文章介紹了PropertyEditors,是用來將文本類型轉換成指定的Java類型,不過,考慮到PropertyEditor的無狀態和非線程安全特性,Spring 3增長了一個Formatter接口來替代它。Formatters提供和PropertyEditor相似的功能,可是提供線程安全特性,也能夠實現字符串和對象類型的互相轉換。面試
假設在咱們的程序中,須要根據一本書的ISBN字符串獲得對應的book對象。經過這個類型格式化工具,咱們能夠在控制器的方法簽名中定義Book參數,而URL參數只須要包含ISBN號和數據庫ID。spring
package com.test.bookpub.formatters; import com.test.bookpub.domain.Book; import com.test.bookpub.repository.BookRepository; import org.springframework.format.Formatter; import java.text.ParseException; import java.util.Locale; public class BookFormatter implements Formatter<Book> { private BookRepository repository; public BookFormatter(BookRepository repository) { this.repository = repository; } @Override public Book parse(String bookIdentifier, Locale locale) throws ParseException { Book book = repository.findBookByIsbn(bookIdentifier); return book != null ? book : repository.findOne(Long.valueOf(bookIdentifier)); } @Override public String print(Book book, Locale locale) { return book.getIsbn(); } }
@Autowired private BookRepository bookRepository; @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new BookFormatter(bookRepository)); }
@RequestMapping(value = "/{isbn}/reviewers", method = RequestMethod.GET) public List<Reviewer> getReviewers(@PathVariable("isbn") Book book) { return book.getReviewers(); }
mvn spring-boot:run
運行程序HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Date: Tue, 08 Dec 2015 08:15:31 GMT Server: Apache-Coyote/1.1 Transfer-Encoding: chunked []
Formatter工具的目標是提供跟PropertyEditor相似的功能。經過FormatterRegistry將咱們本身的formtter註冊到系統中,而後Spring會自動完成文本表示的book和book實體對象之間的互相轉換。因爲Formatter是無狀態的,所以不須要爲每一個請求都執行註冊formatter的動做。數據庫
使用建議:若是須要通用類型的轉換——例如String或Boolean,最好使用PropertyEditor完成,由於這種需求可能不是全局須要的,只是某個Controller的定製功能需求。json
咱們在WebConfiguration中引入(@Autowired)了BookRepository(須要用它建立BookFormatter實例),Spring給配置文件提供了使用其餘bean對象的能力。Spring自己會確保BookRepository先建立,而後在WebConfiguration類的建立過程當中引入。後端
本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。
安全