Spring自定義轉換類,讓@Value更方便


我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!

1 前言

關於配置的文章已經寫了很多,相信看過的人還是會有一定收獲的,系列文章可閱讀:南瓜慢說-配置相關文章。對於@Value的文章可參考《只想用一篇文章記錄@Value的使用,不想再找其它了》。

Spring為大家內置了不少開箱即用的轉換類,如字符串轉數字、字符串轉時間等,但有時候需要使用自定義的屬性,則需要自定義轉換類了。

2 萬能的字符串

當然,任何時候都可以使用字符串作為屬性的值,從配置文件里讀取出來,如下:

配置文件內容為:

pkslow.admin=larry|18|admin@pkslow.com

通過|分割,分別是名字、年齡和郵箱。

對應屬性為:

@Value("${pkslow.admin}")
private String admin;

使用字符串,總是可以獲取,並且不會報錯。我們可以在使用屬性的時候,再轉換成其它Bean

但這樣做有一些問題:

  • 無法做配置檢驗,不管是否配置錯誤,String類型的屬性都是可以讀取的;

  • 任何地方使用,都需要做顯式轉換。

3 自定義轉換類

使用自定義轉換類是更方便和安全的做法。我們來看看怎么實現。

先定義一個Java Bean,用以表示實際的配置內容:

package com.pkslow.cloud.rest.model;

public class Admin {
    private String name;
    private Integer age;
    private String email;

    public Admin(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
  //getter and setter
}

接着肯定需要一個轉換類,需要實現Converter接口:

package com.pkslow.cloud.rest.model;

import org.springframework.core.convert.converter.Converter;

public class AdminConverter implements Converter<String, Admin> {
    @Override
    public Admin convert(String s) {
        String[] strings = s.split("\\|");
        return new Admin(strings[0], Integer.parseInt(strings[1]), strings[2]);
    }
}

這個轉換類就是轉換邏輯,如果把字符串轉換成對應的類。

完成以上兩步,關鍵是如果告訴Spring我具備了這個轉換能力,並幫我轉換。需要把轉換類綁定一下:

package com.pkslow.cloud.rest.config;

import com.pkslow.cloud.rest.model.AdminConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ConversionServiceFactoryBean;

import java.util.Collections;

@Configuration
public class AdminConversionServiceConfig {
    @Bean
    public ConversionServiceFactoryBean conversionService() {
        ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();
        factoryBean.setConverters(Collections.singleton(new AdminConverter()));
        return factoryBean;
    }
}

有了以上功能,使用就非常簡單了。配置不變,使用如下:

package com.pkslow.cloud.rest;

import com.pkslow.cloud.rest.model.Admin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PkslowController {

    @Value("${pkslow.admin}")
    private Admin adminBean;

    @GetMapping("/getAdminBean")
    public Admin getAdminBean() {
        return adminBean;
    }
}

屬性的類型為Admin,是一個自定義的類。啟動訪問后獲取如下:

$ curl localhost:8081/getAdminBean
{"name":"larry","age":18,"email":"admin@pkslow.com"}

說明成功讀取了配置,並轉換成我們想要的domain Object

嘗試把配置改為:pkslow.admin=larry|18a|admin@pkslow.com,則啟動時會報錯:

Caused by: org.springframework.core.convert.ConversionFailedException: 
Failed to convert from type [java.lang.String] to type [@org.springframework.beans.factory.annotation.Value com.pkslow.cloud.rest.model.Admin] 
for value 'larry|18a|admin@pkslow.com'; 
nested exception is java.lang.NumberFormatException: For input string: "18a"

可以做配置檢查。

4 總結

自定義轉換類還是非常有用的。
代碼請查看:https://github.com/LarryDpk/pkslow-samples


歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM