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

目录
  • 一、万能的字符串
  • 二、自定义转换类
  • 三、总结

一、万能的字符串

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

配置文件内容为:

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自定义转换类的详细内容,更多关于Spring自定义转换类的资料请关注我们其它相关文章!

(0)

相关推荐

  • Springmvc自定义类型转换器实现步骤

    一.什么是springmvc类型转换器? 在我们的ssm框架中,前端传递过来的参数都是字符串,在controller层接收参数的时候springmvc能够帮我们将大部分字符串类型的参数自动转换为我们指定的参数,这就是springmvc为我们提供的类型转换器.但是springmvc提供的类型转换器只能够转换指定格式的参数,例如:我们参数中传递time=2020/08/18,在controller中我们就可以通过Date类型的参数接收它,springmvc能够自动将该日期字符串转换为日期对象.但是如

  • SpringBoot在自定义类中调用service层等Spring其他层操作

    背景: 做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库. 为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错. 改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controlle

  • SpringMVC实现自定义类型转换器

    我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据类型的转换,如将String转换成Integer和Double等: <mvc:annotation-driven /> 或 复制代码 代码如下: <bean id="conversionService" class="org.springframework.format.support.Formatt

  • springmvc实现自定义类型转换器示例

    springmvc除了自带的部分类型转换之外,还可以自定义类型转换器,按照以下步骤: 1.写一个类实现Converter接口 package com.hy.springmvc.entities; import org.springframework.core.convert.converter.Converter; import com.google.gson.Gson; public class DepartmentConvertor implements Converter<String,

  • SpringMVC自定义类型转换器实现解析

    这篇文章主要介绍了SpringMVC自定义类型转换器实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 页面录入的字符串:2019/12/05可以映射到实体的日期属性上,但是如果是录入2019-12-05就会报错400 bad request,想要以2019-12-05日期格式的方式映射到实体的日期属性上,需要自定义类型转换器,主要步骤如下: 1. 自定义类实现Convertro<S,T>接口 2.Springmvc.xml中配置Conv

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

    目录 一.万能的字符串 二.自定义转换类 三.总结 一.万能的字符串 当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下: 配置文件内容为: pkslow.admin=larry|18|admin@pkslow.com 通过|分割,分别是名字.年龄和邮箱. 对应属性为: @Value("${pkslow.admin}") private String admin; 使用字符串,总是可以获取,并且不会报错.我们可以在使用属性的时候,再转换成其它Bean. 但这样做有一

  • 浅谈如何在项目中使用Spring Cloud Alibaba Sentinel组件

    目录 Sentinel 是什么 Sentinel与Hystrix的区别 Sentinel分为两大部分: 一.控制台(Dashboard) 二.搭建客户端 1.在自己的项目中引入依赖 2.编辑项目中的 application.yml或者bootstrap.yml文件 3.资源是 Sentinel 中的一个关键概念.它可以是任何东西,例如服务.方法,甚至是代码片段. 三.查看接口的流量的详情 1.实时监控 2.簇点链路 3.等等:其他使用方法有待发掘 Sentinel 是什么 随着微服务的流行,服务

  • 浅谈Go语言不提供隐式数字转换的原因

    什么是隐式转换 在 C 语言中,隐式数字转换是指在某些情况下,编译器会自动将一个数据类型转换为另一个数据类型,而不需要明确地进行类型转换操作. 以下是一些常见的隐式数字转换规则: 当一个整数类型和一个浮点数类型进行运算时,整数类型会被自动转换为浮点数类型. 当一个表达式中包含两种不同类型的整数类型时,小范围的整数类型会被自动转换为大范围的整数类型. 当一个表达式中包含两种不同类型的浮点数类型时,精度较低的浮点数类型会被自动转换为精度较高的浮点数类型. 以下是一个使用隐式数字转换的 C 语言代码示

  • 浅谈C#各种数组直接的数据复制/转换

    之前做Opengl程序,用的的C#的SharpGL这个库,里面有各种奇怪绑定的函数,比如原型为: void glInterleavedArrays(uint format, int stride, void * pointer); 的函数被他绑定成: private static extern void glInterleavedArrays(uint format, int stride, int[] pointer); 然后我就被逼着学习了各种float[] 转 int[] 的方法,比较他们

  • 浅谈在Vue.js中如何实现时间转换指令

    在社区中,发布的动态信息,经常会有一个相对余实际发布时间的相对时间.比如这里的微博: 服务端存储的时间格式,一般为 Unix 时间戳,比如 2019/1/6 13:40:1 的Unix 时间戳为 1546753201651.前端在获取到这个时间戳之后,会转换为可读格式的时间.在社交类产品中,一般会将时间戳转换为 x 分钟前,x 小时前或者 x 天前,因为这样的显示方式用户体验更好. 我们可以自定义一个 v-relative-time 指令来实现上述功能. html: <!DOCTYPE html

  • 浅谈为什么同一个java文件只能有一个public类

    最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找 在阅读JDK源码时可能会看到在一个public class中"居然"存在另一个public class,似乎跟学习java时提到的"同一个源程序中只能有一个public类"有点矛盾.其实不然,一张图足以完全说明: 补充:问题:一个".java"

  • 浅谈Spring的两种配置容器

    Spring提供了两种容器类型 SpringIOC容器是一个IOC Service Provider.提供了两种容器类型:BeanFactory和ApplicationContext.Spring的IOC容器是一个提供IOC支持的轻量级容器.除了基本的ioc支持,它作为轻量级容器还提供了IOC之外的支持. BeanFactory BeanFactory是基础类型IOC容器.顾名思义,就是生产Bean的工厂.能够提供完整的IOC服务.没有特殊指定的话,其默认采用延迟初始化策略.只有当客户端对象需要

  • 浅谈自定义注解在Spring中的应用

    1.Java自定义注解与Spring Java注解作为程序元素(类.成员变量.成员方法等)的一种元数据信息,对程序本身的执行不会产生影响.通过自定义注解,可以给程序元素添加特殊的声明. Spring作为构建企业级应用的平台,提供了丰富的功能.将Java的自定义注解与Spring结合,在特定场景下实现注解的解析.处理,可以降低应用的耦合度,提高程序的可扩展性. 2.应用场景 下面总结几种应用场景,仅说明大致思路(ps:并非所有场景都在项目中实践过) 2.1登陆.权限拦截 在web项目中,登陆拦截和

  • 浅谈Spring嵌套事务是怎么回滚的

    目录 源码解析 TransactionAspectSupport.invokeWithinTransaction() 内层事务 TransactionAspectSupport.completeTransactionAfterThrowing() AbstractPlatformTransactionManager rollback() DataSourceTransactionManager#doSetRollbackOnly DataSourceTransactionObject#setRo

  • 浅谈多线程_让程序更高效的运行

    Java Thread 的一些认识: Java是抢占式线程,一个线程就是进程中单一的顺序控制流,单个进程可以拥有多个并发任务,其底层是切分CPU时间,多线程和多任务往往是使用多处理器系统的最合理方式 进程可以看作一个程序或者一个应用:线程是进程中执行的一个任务,多个线程可以共享资源 一个Java 应用从main 方法开始运行,main 运行在一个线程内,也被称为 "主线程",Runnable也可以理解为Task (任务) JVM启动后,会创建一些守护线程来进行自身的常规管理(垃圾回收,

随机推荐