zoukankan      html  css  js  c++  java
  • Spring自定义转换类,让@Value更方便

    我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶!

    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


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

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

  • 相关阅读:
    python线程详解
    Beego框架在模板中使用自定义函数
    golang打印英文格式时间日期
    如何让SQL语句不执行默认排序,而是按照in语句的顺序返回结果
    Git clone 报错 Unable to negotiate with xxx.xxx.xxx.xxx port 12345: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc
    Mysql去掉html标签函数
    Nodejs的npm安装模块时候报错:npm ERR! Error: CERT_UNTRUSTED的解决方法
    树莓派使用DHT11温湿度传感器
    ubuntu源列表(清华,阿里,官方,选一即可)
    将tgz文件解压到指定目录
  • 原文地址:https://www.cnblogs.com/larrydpk/p/14916921.html
Copyright © 2011-2022 走看看