Spring自定义转换类,让@Value更方便
我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶!1 前言 【Spring自定义转换类,让@Value更方便】关于配置的文章已经写了很多,相信看过的人还是会有一定收获的,系列文章可阅读:南瓜慢说-配置相关文章。对于
@Value
的文章可参考《只想用一篇文章记录@Value的使用,不想再找其它了》。Spring
为大家内置了不少开箱即用的转换类,如字符串转数字、字符串转时间等,但有时候需要使用自定义的属性,则需要自定义转换类了。2 万能的字符串 当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:
配置文件内容为:
pkslow.admin=larry|18|admin@pkslow.com
通过
|
分割,分别是名字、年龄和邮箱。对应属性为:
@Value("${pkslow.admin}")
private String admin;
使用字符串,总是可以获取,并且不会报错。我们可以在使用属性的时候,再转换成其它
Bean
。但这样做有一些问题:
- 无法做配置检验,不管是否配置错误,
String
类型的属性都是可以读取的; - 任何地方使用,都需要做显式转换。
先定义一个
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 {
@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/p...
文章图片
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
文章图片
多读书,多分享;多写作,多整理。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- 一起来学习C语言的字符串转换函数
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 解决SpringBoot引用别的模块无法注入的问题
- 视频转换器哪种好用()
- 列出所有自定义的function和view
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- 以太坊中的计量单位及相互转换
- spring|spring boot项目启动websocket