SpringBoot自定义转换器应用实例讲解

目录
  • 1.基本介绍
  • 2.自定义类型转换器应用实例
    • 1.需求说明
    • 2.代码实现
    • 3.注意事项及使用细节

1.基本介绍

SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器

SpringBoot 也支持自定义转换器, 这个内置转换器在 debug 的时候, 可以看到, 提供了 124 个内置转换器. 看下源码 GenericConverter-ConvertiblePair

2.自定义类型转换器应用实例

1.需求说明

演示自定义转换器使用

2.代码实现

1.修改src\main\resources\static\save.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加妖怪</title></head>
<body><h1>添加妖怪-坐骑[测试封装 POJO;]</h1>
<form action="/savemonster" method="post">
    编号: <input name="id" value="100"><br/>
    姓名: <input name="name" value="牛魔王"/><br/>
    年龄: <input name="age" value="120"/> <br/>
    婚否: <input name="isMarried" value="true"/> <br/>
    生日: <input name="birth" value="2000/11/11"/> <br/>
    <!-- 使用自定义转换器关联car, 字符串整体提交, 使用,号间隔  -->
    坐骑:<input name="car" value="避水金晶兽,666.6"><br/>
    <input type="submit" value="保存"/>
</form>
</body>
</html>

2.修改src\main\java\com\llp\springboot\controller\ParameterController.java

@PostMapping("/savemonster")
public String saveMonster(Monster monster) {
    //monster= Monster(id=100, name=牛魔王, age=120, isMarried=true, birth=Sat Nov 11 00:00:00 CST 2000, car=Car(name=避水金晶兽, price=666.6))
    System.out.println("monster= " + monster);
    return "success";
}

3.自定义一个类型转换器src\main\java\com\llp\springboot\config\WebConfig.java

/**
 * 开启lite模式,通过容器获取bean时将是多例的
 */
@Configuration(proxyBeanMethods = false)
public class WebConfig {
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                /**
                 * 1. 在addFormatters 方法中,增加一个自定义的转换器
                 * 2. 增加自定义转换器 String -> Car
                 * 3. 增加的自定义转换器会注册到 converters 容器中
                 * 4. converters 底层结构是 ConcurrentHashMap 内置有124转换器
                 */
                registry.addConverter(new Converter<String, Car>() {
                    @Override
                    public Car convert(String content) {
                        if (!ObjectUtils.isEmpty(content)) {
                            //避水金晶兽,666.6
                            String[] split = content.split(",");
                            String name = split[0];
                            double price = Double.parseDouble(split[1]);
                            return new Car(name, price);
                        }
                        return null;
                    }
                });
            }
        };
    }
}

3.注意事项及使用细节

1.我们可以定义多个自定义转换器

/**
 * 开启lite模式,通过容器获取bean时将是多例的
 */
@Configuration(proxyBeanMethods = false)
public class WebConfig {
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                Converter<String, Car> carConverter1 = new Converter<String, Car>() {
                    @Override
                    public Car convert(String content) {
                        if (!ObjectUtils.isEmpty(content)) {
                            //避水金晶兽,666.6
                            String[] split = content.split(",");
                            String name = split[0];
                            double price = Double.parseDouble(split[1]);
                            return new Car(name, price);
                        }
                        return null;
                    }
                };
                Converter<String, Monster> monsterConverter = new Converter<String, Monster>() {
                    @Override
                    public Monster convert(String s) {
                        return null;
                    }
                };
                Converter<String, Car> carConverter2 = new Converter<String, Car>() {
                    @Override
                    public Car convert(String s) {
                        System.out.println(s);
                        return null;
                    }
                };
                registry.addConverter(carConverter1);
                //carConverter1、carConverter2的key均为 java.lang.String->com.llp.springboot.bean.Car组成
                //因此carConverter2会覆盖掉carConverter1
                registry.addConverter(carConverter2);
                registry.addConverter(monsterConverter);
            }
        };
    }
}

2.底层在定义了一变量名为convertes的ConCurrentHashMap用于存储所有的类型转换器,而key是由“原类型->目标类型”构成的,因此当自定义的key相同时会覆盖调之前的类型转换器,这里我们定义了三个自定义转换器但其中两个时相同的key因此只会保留最后一次添加的类型转换器

到此这篇关于SpringBoot自定义转换器应用实例讲解的文章就介绍到这了,更多相关SpringBoot自定义转换器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Springboot自定义转换器实现参数去空格功能

    目录 自定义转换器实现参数去空格 1.自定义转换器类 2.将转换器交给spring容器处理 SpringBoot请求参数过滤空格 1.参数修改SpaceHttpServletRequestWrapper 2.空格过滤器 3.过滤器初始化 自定义转换器实现参数去空格 1.自定义转换器类 实现Converter<S, T>类,重写convert()方法,直接上代码. /** * 自定义转换器 * 去掉前后空格 * @author liuy * @version 2018年11月13日 */ pub

  • jackson在springboot中的使用方式-自定义参数转换器

    目录 springboot jackson使用-自定义参数转换器 要实现的功能 思路 关键代码 Jackson自定义转换器 @JsonDeserialize注解源码 以日期类型为例 自定义转换方法 springboot jackson使用-自定义参数转换器 springboot中默认使用jackson,且实现了很多参数转换器,其中就有EnumToStringConverter和StringToEnumConverterFactory,用于字符串和枚举的互转.但是是根据枚举名称互转. 要实现的功能

  • SpringBoot自定义转换器应用实例讲解

    目录 1.基本介绍 2.自定义类型转换器应用实例 1.需求说明 2.代码实现 3.注意事项及使用细节 1.基本介绍 SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器 SpringBoot 也支持自定义转换器, 这个内置转换器在 debug 的时候, 可以看到, 提供了 124 个内置转换器. 看下源码 GenericConverter-ConvertiblePair 2.自定义类型转换器应用实例 1.需求说明 演示自定义转换器使用 2.代码实现 1.修改sr

  • string boot 与 自定义interceptor的实例讲解

    前面学习过过滤器, 但是过滤器是针对servlet的, 用在springmvc和spring boot里面, 功能上, 感觉并不是很好用. 那这里来学习一下拦截器. 一. 拦截器的执行顺序 1. 目录 2. 拦截器 拦截器里面, 我加了三个(First,Two,Third), 但是内容都差不多. package org.elvin.boot.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import

  • 对angularJs中2种自定义服务的实例讲解

    本篇文章介绍2种自定义服务的方式,一种是用factory,一种是用service 一.首先介绍使用factory来进行自定义服务 1.html <div ng-app="module" ng-controller="ctrl"> <table border="1" width="600"> <tr> <td>网站名称</td> <td>网址</td&

  • Springboot 自定义校验代码实例

    这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 StartWithValidation.class @Documented @Constraint(validatedBy = StartWithValidator.class ) @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface StartWithValidati

  • springboot日期转换器实现实例解析

    这篇文章主要介绍了springboot日期转换器实现实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 注:该功能并非springboot特有的功能,springmvc同样具有 一.使用方法 创建一个DateConverter类实现Converter接口 注:importorg.springframework.core.convert.converter.Converter; Converter<S,T> @param<S>t

  • Jquery ajax执行顺序 返回自定义错误信息(实例讲解)

    1.多个Ajax 在一个function中的执行顺序 由于Jquery中的Ajax的async默认是true(异步请求),如果想一个Ajax执行完后再执行另一个Ajax, 需要把async=false就可以了. 复制代码 代码如下: function TestAjax(){            var UserName = $("#txtUserName").val();            $.ajax(            {                url: &quo

  • spring boot自定义log4j2日志文件的实例讲解

    背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8.RELEASE 引入log4j2的开发步骤如下: 1.首先把spring-boot-starter-web以及spring-boot-starter包下面的spring-boot-starter-logging排除,然后引入spring-boot-starter-log4j2包. <dependen

  • SpringBoot日期格式转换之配置全局日期格式转换器的实例详解

    1. SpringBoot设置后台向前台传递Date日期格式 在springboot应用中,@RestController注解的json默认序列化中,日期格式默认为:2020-12-03T15:12:26.000+00:00类型的显示. 在实际显示中,我们需要对其转换成我们需要的显示格式. 1.1 方式1:配置文件修改 配置文件配置application.yml: spring: # 配置日期格式化 jackson: date-format: yyyy-MM-dd HH:mm:ss #时间戳统一

  • SpringBoot接收参数使用的注解实例讲解

    目录 1.基本介绍 2.接收参数相关注解应用实例 @PathVariable 使用 @RequestHeader 使用 @RequestParam 使用 @CookieValue 使用 @RequestBody 使用 3.复杂参数 1.基本介绍 2.复杂参数应用实例 4.自定义对象参数-自动封装 1.基本介绍 2.自定义对象参数-应用实例 1.基本介绍 SpringBoot 接收客户端提交数据/参数会使用到相关注解 详 解 @PathVariable . @RequestHeader . @Mo

随机推荐