Spring Boot項(xiàng)目中定制PropertyEditors方法
在Spring Boot: 定制HTTP消息轉(zhuǎn)換器一文中我們學(xué)習(xí)了如何配置消息轉(zhuǎn)換器用于HTTP請(qǐng)求和響應(yīng)數(shù)據(jù),實(shí)際上,在一次請(qǐng)求的完成過程中還發(fā)生了其他的轉(zhuǎn)換,我們這次關(guān)注將參數(shù)轉(zhuǎn)換成多種類型的對(duì)象,如:字符串轉(zhuǎn)換成Date對(duì)象或字符串轉(zhuǎn)換成Integer對(duì)象。
在編寫控制器中的action方法時(shí),Spring允許我們使用具體的數(shù)據(jù)類型定義函數(shù)簽名,這是通過PropertyEditor實(shí)現(xiàn)的。PropertyEditor本來是JDK提供的API,用于將文本值轉(zhuǎn)換成給定的類型,結(jié)果Spring的開發(fā)人員發(fā)現(xiàn)它恰好滿足Spring的需求——將URL參數(shù)轉(zhuǎn)換成函數(shù)的參數(shù)類型。
針對(duì)常用的類型(Boolean、Currency和Class),Spring MVC已經(jīng)提供了很多PropertyEditor實(shí)現(xiàn)。假設(shè)我們需要?jiǎng)?chuàng)建一個(gè)Isbn類并用它作為函數(shù)中的參數(shù)。
實(shí)戰(zhàn)
考慮到PropertyEditor屬于工具范疇,選擇在項(xiàng)目根目錄下增加一個(gè)包——utils。在這個(gè)包下定義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完成字符串到具體對(duì)象類型的轉(zhuǎn)換,getAsText完成具體對(duì)象類型到字符串的轉(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注解修飾,則可以針對(duì)每個(gè)web請(qǐng)求創(chuàng)建一個(gè)editor實(shí)例。
@InitBinderpublic void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Isbn.class, new IsbnEditor()); }
修改BookController中對(duì)應(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時(shí)沒什么不同,說明我們編寫的IsbnEditor已經(jīng)起作用了。
分析
Spring提供了很多默認(rèn)的editor,我們也可以通過繼承PropertyEditorSupport實(shí)現(xiàn)自己定制化的editor。
由于ProperteyEditor是非線程安全的。通過@InitBinder注解修飾的initBinder函數(shù),會(huì)為每個(gè)web請(qǐng)求初始化一個(gè)editor實(shí)例,并通過WebDataBinder對(duì)象注冊(cè)。
相關(guān)文章
SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程
這篇文章主要介紹了SkyWalking?自定義插件(Spring?RabbitMQ)具體分析過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Java集合的組內(nèi)平均值的計(jì)算方法總結(jié)
在Java中,經(jīng)常需要對(duì)集合進(jìn)行各種操作,其中之一就是計(jì)算集合的組內(nèi)平均值,本文將介紹如何使用Java集合來計(jì)算組內(nèi)平均值,并提供一些示例代碼和實(shí)用技巧2024-08-08用java實(shí)現(xiàn)跳動(dòng)的小球示例代碼
這篇文章主要介紹了用java實(shí)現(xiàn)跳動(dòng)的小球,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Java Swing樹狀組件JTree用法實(shí)例詳解
這篇文章主要介紹了Java Swing樹狀組件JTree用法,結(jié)合具體實(shí)例形式分析了Swing組件JTree構(gòu)成樹狀列表的節(jié)點(diǎn)設(shè)置與事件響應(yīng),以及自定義圖形節(jié)點(diǎn)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合)
本篇文章主要介紹了SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合),這個(gè)例子是基于SpringMVC+Spring+Mybatis實(shí)現(xiàn)的。有興趣的可以了解一下。2017-03-03springboot vue項(xiàng)目后端列表接口分頁(yè)模糊查詢
這篇文章主要為大家介紹了springboot vue項(xiàng)目后端列表接口分頁(yè)模糊查詢,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
轉(zhuǎn)發(fā)和重定向都是常用的頁(yè)面跳轉(zhuǎn)方式,但在實(shí)現(xiàn)上有一些區(qū)別,本文主要介紹了Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01