浅谈让@Value更方便的Spring自定义转换类
作者:南瓜慢说 发布时间:2023-10-06 14:01:02
一、万能的字符串
当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:
配置文件内容为:
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
来源:https://www.cnblogs.com/larrydpk/p/14916921.html


猜你喜欢
- Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置
- Unity打开Unity Ctrl+9,打开Unity商店,下载TexturePacker Importer插件这个插件是用来解析图集文件的
- 在远程调用中,需要把参数和返回值通过网络传输,这个使用
- 在上篇文章给大家介绍了使用Java8 实现观察者模式的方法(上),本文继续给大家介绍java8观察者模式相关知识,具体内容如下所述:线程安全
- 可以使用 graphics2D 类提供的 shear(
- tk.mybatis扩展自己的通用mapper目的:tk.mybatis 提供的通用mapper,虽然使用方便,不过在有些sql还是不能满足
- Android使用RecyclerView1. 什么是RecyclerViewRecyclerView 是 Android-support-
- 在开发时,手机先要ROOT,然后在通过代码改变权限。<span style="color:#330033;">
- 甲:听说最近java跌落神坛,python称霸武林了,你知道吗?乙:不是吧,我前几天看python怎么还是第三?丙:你们都在扯蛋,pytho
- 我就废话不多说了,大家还是直接看代码吧~/** * feign调用客户端 */@FeignClient(name = "user&
- 前言我们之前讲述的动画都需要主动触发或者是重复执行,那有没有自己触发动画的组件呢?这样我们就可以在 StatelessWidget 里直接使
- 之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫描
- SpringAOP获取方法参数上的注解一、示例① 如下代码,自定义一个参数注解@Test,并将其使用到方法参数上,用于标注需要检验的参数/*
- 本文实例讲述了Java实现过滤掉map集合中key或value为空的值。分享给大家供大家参考,具体如下:import java.util.C
- AudioSource 组件参考属性属性说明Clip音频资源Volume音量大小Mute是否静音Loop是否循环Play on load加载
- 本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下1、有个需求就是,忘记密码后通过邮箱找回。现在的系统在注
- javaWeb 四大域对象1)和属性相关的方法Object getAttribute(String name) 获取指定的属性En
- 1.准备工作1、新建一个SpringBoot项目加上web依赖, 所有依赖<dependency><groupId>
- 本文实例为大家分享了Android简单实现文件下载的具体代码,供大家参考,具体内容如下权限<!-- 文件读写权限 &nbs
- Eclipse ADT的Custom debug keystore自定义调试证书的时候,Android应用开发接入各种SDK时会发现,有很多