欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-19 09:21:39
目录一、万能的字符串当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:配置文件内容为:pkslow.admin=larry|18|admin@pkslow.com通过|分割,分别...

一、万能的字符串

当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:

配置文件内容为:

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自定义转换类

以上就是浅谈让@value更方便的spring自定义转换类的详细内容,更多关于spring自定义转换类的资料请关注其它相关文章!