南瓜慢说官方网站

  • 首页
  • 文章汇总
  • 容器技术
  • SpringBoot-Cloud
  • 程序人生
  • 其它
  • 整理
  • 关于

  • 搜索
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
技术之前,先读诗书:

Spring自定义转换类,让@Value更方便

发表于 2020-12-20 | 分类于 Springboot | 0 | 阅读次数 280

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


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

file

推荐阅读:
如何制定切实可行的计划并好好执行
容器技术(Docker-Kubernetes)
SpringBoot-Cloud相关
Https专题

  • 本文作者: 南瓜慢说
  • 本文链接: https://www.pkslow.com/archives/spring-custom-convert
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# 中间件 # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # 计划 # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # 性能 # Email # Springboot # 集合类 # ArrayList # Java
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
2020年11月CKA新题考试心得体会
Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制
  • 文章目录
  • 站点概览
南瓜慢说

南瓜慢说

多年Java开发,主要专注后端技术:Java/Spring/Springboot/微服务/大数据等。

多读书,多分享;多写作,多整理。

166 日志
7 分类
27 标签
RSS
0%
© 2020 — 2021 南瓜慢说 本站已挣扎运行:   粤ICP备20036375号