鍍金池/ 教程/ Java/ Spring Boot:定制PropertyEditors
通過JMX監(jiān)控Spring Boot應(yīng)用
Spring Boot:定制PropertyEditors
配置是否初始化Bean的方法
Spring Boot的自動配置、Command-line Runner
Spring Boot:定制URL匹配規(guī)則
Spring Boot的自動配置、Command-line Runner
利用Mockito模擬DB
Spring Boot應(yīng)用的打包和部署
了解Spring Boot的自動配置
Spring Boot應(yīng)用的健康監(jiān)控
了解Spring Boot的自動配置
初始化數(shù)據(jù)庫和導(dǎo)入數(shù)據(jù)
Spring Boot應(yīng)用的健康監(jiān)控
Docker with Spring Boot
RESTful by Spring Boot with MySQL
Spring Boot:定制攔截器
Spring Boot:定制static path mappings
Spring Boot with Mysql
Spring Boot:定制自己的starter
在測試中使用內(nèi)存數(shù)據(jù)庫
Restful: Spring Boot with Mongodb
Spring Boot with Redis
Spring Boot:定制HTTP消息轉(zhuǎn)換器
Spring Boot: Data Rest Service
Spring Boot:定制type Formatters
在Spring Boot項目中使用Spock框架
選擇Spring Boot項目的內(nèi)嵌容器
通過EmbeddedServletContainerCustomizer接口調(diào)優(yōu)Tomcat
Spring Boot應(yīng)用的打包和部署
Spring Boot Admin的使用
讓你的Spring Boot工程支持HTTP和HTTPS
Spring Boot:定制servlet filters
Spring Boot:定制URL匹配規(guī)則
Spring Boot應(yīng)用的測試——Mockito
Spring Boot應(yīng)用的測試——Mockito
Spring Boot:定制servlet filters
通過@Enable*注解觸發(fā)Spring Boot配置

Spring Boot:定制PropertyEditors

Spring Boot: 定制HTTP消息轉(zhuǎn)換器一文中我們學(xué)習(xí)了如何配置消息轉(zhuǎn)換器用于HTTP請求和響應(yīng)數(shù)據(jù),實際上,在一次請求的完成過程中還發(fā)生了其他的轉(zhuǎn)換,我們這次關(guān)注將參數(shù)轉(zhuǎn)換成多種類型的對象,如:字符串轉(zhuǎn)換成Date對象或字符串轉(zhuǎn)換成Integer對象。

在編寫控制器中的action方法時,Spring允許我們使用具體的數(shù)據(jù)類型定義函數(shù)簽名,這是通過PropertyEditor實現(xiàn)的。PropertyEditor本來是JDK提供的API,用于將文本值轉(zhuǎn)換成給定的類型,結(jié)果Spring的開發(fā)人員發(fā)現(xiàn)它恰好滿足Spring的需求——將URL參數(shù)轉(zhuǎn)換成函數(shù)的參數(shù)類型。

針對常用的類型(Boolean、Currency和Class),Spring MVC已經(jīng)提供了很多PropertyEditor實現(xiàn)。假設(shè)我們需要創(chuàng)建一個Isbn類并用它作為函數(shù)中的參數(shù)。

How Do

  • 考慮到PropertyEditor屬于工具范疇,選擇在項目根目錄下增加一個包——utils。在這個包下定義Isbn類和IsbnEditor類,各自代碼如下: Isbn類:
package com.test.bookpub.utils;

public class Isbn {
    private String isbn;

    public Isbn(String isbn) {
        this.isbn = isbn;
    }
    public String getIsbn() {
        return isbn;
    }
}
  • IsbnEditor類,繼承PropertyEditorSupport類,setAsText完成字符串到具體對象類型的轉(zhuǎn)換,getAsText完成具體對象類型到字符串的轉(zhuǎn)換。
package com.test.bookpub.utils;
import org.springframework.util.StringUtils;
import java.beans.PropertyEditorSupport;

public class IsbnEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.hasText(text)) {
            setValue(new Isbn(text.trim()));
        } else {
            setValue(null);
        }
    }
    @Override    public String getAsText() {
        Isbn isbn = (Isbn) getValue();
        if (isbn != null) {
            return isbn.getIsbn();
        } else {
            return "";
        }
    }
}
  • 在BookController中增加initBinder函數(shù),通過@InitBinder注解修飾,則可以針對每個web請求創(chuàng)建一個editor實例。
@InitBinderpublic 
void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Isbn.class, new IsbnEditor());
}
  • 修改BookController中對應(yīng)的函數(shù)
@RequestMapping(value = "/{isbn}", method = RequestMethod.GET)
public Map<String, Object> getBook(@PathVariable Isbn isbn) {
    Book book =  bookRepository.findBookByIsbn(isbn.getIsbn());
    Map<String, Object> response = new LinkedHashMap<>();
    response.put("message", "get book with isbn(" + isbn.getIsbn() +")");
    response.put("book", book);    return response;
}

運(yùn)行程序,通過Httpie訪問http localhost:8080/books/9781-1234-1111,可以得到正常結(jié)果,跟之前用String表示isbn時沒什么不同,說明我們編寫的IsbnEditor已經(jīng)起作用了。

分析

Spring提供了很多默認(rèn)的editor,我們也可以通過繼承PropertyEditorSupport實現(xiàn)自己定制化的editor。

由于ProperteyEditor是非線程安全的。通過@InitBinder注解修飾的initBinder函數(shù),會為每個web請求初始化一個editor實例,并通過WebDataBinder對象注冊。