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


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

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

  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/larrydpk/p/14916921.html
Copyright © 2011-2022 走看看