Spring Boot 2.x实战43 - Spring Web MVC 15 - Web MVC配置(类型转换原理与设置-Converter和ConverterFactory)

本文深入探讨Spring Boot 2.x的Spring Web MVC中的类型转换,介绍了Converter和ConverterFactory的原理及设置。内容涵盖类型转换的重要性,如何自定义转换器,以及内置的转换功能。通过示例展示了如何将字符串转换为数字和布尔值,并讨论了在Spring Boot中注册转换器的不同方式。
3.8 类型转换原理与设置

Spring为我们提供了ConversionService接口用来做类型转换,它是Spring类型转换系统的入口。像我们注册的FormatterFormattingConversionService类就是它的实现类。

FormattingConversionService支持注册FormatterConverterAnnotationFormatterFactory,它属于配置初始化数据绑定的一部分。

3.8.1 Formatter

Formatter用于格式化(id|name|age)对象类型(如Person)。我们在前面已经演示了自定义的Format,这里就不再演示了,在AnnotationFormatterFactory中我们将会使用大量的Formatter

3.8.2 ConverterConverterFactory
3.8.2.1 常用的ConverterConverterFactory

将源对象类型S转换成目标对象类型T,这个是Sping和Spring MVC对象之间类型转换的重要功能,若外部的对象类型是字符串"1",Spring MVC也能将它正确的转换成对应的数字类型。

我们的控制器做如下的检验:

@GetMapping("/{id}/convert")
public Map<String, Object> convert(@PathVariable Long id,
                                   @RequestParam Boolean testBool,
                                   @RequestBody Person person){
    Map<String, Object> map = new HashMap<>();
    map.put("id", id);
    map.put("date", testBool);
    return map;
}

我们请求地址http://localhost:8080/people/8/convert?testBool=true,字符串8会通过StringToNumberConverterFactory.StringToNumber转换成数字;同样字符串true也通过StringToBooleanConverter转换成布尔值。这里放一个@RequestBody是为了告诉我们,请求体的转换是通过HttpMessageConverter做的,且初始化数据绑定是先处理的,对于@ResponseBody的控制器方法参数处理是后处理的。
在这里插入图片描述
Spring MVC给我们内置了很多ConverterConverterFactory,它们主要在org.springframework.core.convert包中。

3.8.2.2 自定义Converter

我们也简单的定义一个Converter用来演示将字符串转换成字符串长度:

//...
import org.springframework.core.convert.converter.Converter;
//..
public class StringToLengthConverter implements Converter<String, Integer> , ConditionalConverter {
    @Override
    public Integer convert(String source) {
        return Integer.valueOf(source.length());
    }

    @Override
    public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
        return targetType.hasAnnotation(StrLength.class);
    }
}

我们除了实现Converter接口进行转换意外,还要实现ConditionalConverter接口,声明在何种情况下该Converter会被调用,本例是方法参数钱注解了@StrLength

标记注解的声明:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StrLength {
}

通过ConfigurableWebBindingInitializer的Bean配置,通过addConverter方法添加:

    @Bean
    ConfigurableWebBindingInitializer ConfigurableWebBindingInitializer(FormattingConversionService mvcConversionService){
        ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
        
        mvcConversionService.addConverter(new StringToLengthConverter());
        initializer.setConversionService(mvcConversionService);
        return initializer;

    }

当然在Spring MVC下还可以通过WebMvcConfigurer接口的addFormatters来注册:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToLengthConverter());
    }
}

在Spring Boot下更简单,我们只需要注册Converter的Bean即可:

@Bean
Converter stringToLengthConverter(){
    return new StringToLengthConverter();
}

通过控制器检验:

@GetMapping("/convert")
public Integer convert(@StrLength Integer person){
    return person;
}

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值