乐趣区

关于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/p…


欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …

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

退出移动版