浅谈让@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自定义转换类的资料请关注179885.Com其它相关文章!

猜你在找的浅谈让@Value更方便的Spring自定义转换类相关文章

Spring为大家内置了不少开箱即用的转换类,如字符串转数字、字符串转时间等,但有时候需要使用自定义的属性,则需要自定义转换类了
今天给大家带来的是关于Java的相关知识,文章围绕着在没有编辑器的环境下如何创建Servlet(Tomcat+Java)项目展开,文中有非常详细的介绍及代码示例,需求的大佬可以
文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念synchronized,希望能够给你有
本文展示通过一个案例来自己手写IOC和AOP代码,通过银行转账案例详细的代码编写和文档解释来说明IOC和AOP的思想,会分享存在的问题和解决问题的思路
不少同学开始慢慢接触多线时候,对线程之间为了保障数据安全性,一致性有所了解,本文详细解介绍java中的21种锁 ,需求的大佬可以参考下
今天给大家带来的是关于Springboot的相关知识,文章围绕着RestTemplate未使用线程池展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
了Springboot开发OAuth2认证授权与资源服务器操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Comparator比较器接口可以将自身传递给排序方法(比如Collections.sort或Arrays.sort),以便对排序顺序进行精确控制。本文讲述Spring中如何使用Comparator接口
今天给大家带来的是关于Java的相关知识,文章围绕着comparable和comparator的区别展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
本文将向您展示如何使用Spring Boot创建一个的Spring Batch的Hello World示例。对和我一样入门的有一定的帮助,感兴趣的小伙伴们可以参考一下
了springboot+springsecurity如何实现动态url细粒度权限认证的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Semaphore一般译作信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操