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
欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新…