浅谈让@Value更方便的Spring自定义转换类

网友投稿 269 2022-10-18


浅谈让@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 {

@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自定义转换类的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:# 再次推荐github 6.7k star开源IM项目OpenIM性能测试及消息可靠性测试报告
下一篇:nVisual让网络物理层管理不再缺失
相关文章

 发表评论

暂时没有评论,来抢沙发吧~