Spring Boot實戰之定製type Formatters

本文首發於我的網站:Spring Boot實戰之定製type Formattersjava

前面咱們有篇文章介紹了PropertyEditors,是用來將文本類型轉換成指定的Java類型,不過,考慮到PropertyEditor的無狀態和非線程安全特性,Spring 3增長了一個Formatter接口來替代它。Formatters提供和PropertyEditor相似的功能,可是提供線程安全特性,也能夠實現字符串和對象類型的互相轉換。面試

假設在咱們的程序中,須要根據一本書的ISBN字符串獲得對應的book對象。經過這個類型格式化工具,咱們能夠在控制器的方法簽名中定義Book參數,而URL參數只須要包含ISBN號和數據庫ID。spring

實戰

  • 首先在項目根目錄下建立formatters
  • 而後建立BookFormatter,它實現了Formatter接口,實現兩個函數:parse用於將字符串ISBN轉換成book對象;print用於將book對象轉換成該book對應的ISBN字符串。
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();
    }
}
  • 在WebConfiguration中添加咱們定義的formatter,重寫(@Override修飾)addFormatter(FormatterRegistry registry)函數。
@Autowired
private BookRepository bookRepository;

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new BookFormatter(bookRepository));
}
  • 最後,須要在BookController中新加一個函數getReviewers,根據一本書的ISBN號獲取該書的審閱人。
@RequestMapping(value = "/{isbn}/reviewers", method = RequestMethod.GET)
public List<Reviewer> getReviewers(@PathVariable("isbn") Book book) {
    return book.getReviewers();
}
  • 經過mvn spring-boot:run運行程序
  • 經過httpie訪問URL——http://localhost:8080/books/9781-1234-1111/reviewers,獲得的結果以下:
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類的建立過程當中引入。後端

Spring Boot 1.x系列

  1. Spring Boot的自動配置、Command-line-Runner
  2. 瞭解Spring Boot的自動配置
  3. Spring Boot的@PropertySource註解在整合Redis中的使用
  4. Spring Boot項目中如何定製HTTP消息轉換器
  5. Spring Boot整合Mongodb提供Restful接口
  6. Spring中bean的scope
  7. Spring Boot項目中使用事件派發器模式
  8. Spring Boot提供RESTful接口時的錯誤處理實踐
  9. Spring Boot實戰之定製本身的starter
  10. Spring Boot項目如何同時支持HTTP和HTTPS協議
  11. 自定義的Spring Boot starter如何設置自動配置註解
  12. Spring Boot項目中使用Mockito
  13. 在Spring Boot項目中使用Spock測試框架
  14. Spring Boot項目中如何定製攔截器
  15. Spring Boot項目中如何定製PropertyEditors
  16. Spring Boot構建的Web項目如何在服務端校驗表單輸入
  17. Spring Boot應用的健康監控
  18. Spring Boot項目中如何定製servlet-filters
  19. Spring Boot實戰之定製URL匹配規則

本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。
javaadu安全

相關文章
相關標籤/搜索