浅谈让@Value更方便的Spring自定义转换类
一、万能的字符串
当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:
配置文件内容为:
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<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"
可以做配置检查。
三、总结
自定义转换类还是非常有用的。
代码请查看:https://github.com/larrydpk/pkslow-samples
以上就是浅谈让@value更方便的spring自定义转换类的详细内容,更多关于spring自定义转换类的资料请关注其它相关文章!