SpringBoot自定义对象参数实现自动类型转换与格式化

 更新时间:2022年09月29日 16:28:12   作者:刘婉晴  
SpringBoot 通过自定义对象参数,可以实现自动类型转换与格式化,并可以级联封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

序章

问题提出一:

当我们用表单获取一个 Person 对象的所有属性值时, SpringBoot 是否可以直接根据这些属性值将其转换为 Person 对象

回答:

当然可以,SpringBoot 通过自定义对象参数,可以实现自动类型转换与格式化,并可以级联封装(一个对象拥有另一个对象作为属性时,也可以封装)。

一、实体类 Bean

person类

注: 构造方法一定要写全,无参数和有参数的都要写,不然封装过程会出问题

import org.springframework.context.annotation.Bean;
import javax.xml.crypto.Data;
public class Person {
    String userName;
    int age;
    Pet pet;
    public Person() {
    }
    public Person(String userName, int age, Pet pet) {
        this.userName = userName;
        this.age = age;
        this.pet = pet;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Pet getPet() {
        return pet;
    }
    public void setPet(Pet pet) {
        this.pet = pet;
    }
}

pet类

package com.example.demo2.bean;
public class Pet {
    String name;
    String age;
    public Pet() {
    }
    public Pet(String name, String age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}

二、前端表单index.html

注意 input 的 name 属性值要与类的属性名一一对应

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义参数绑定原理</title>
</head>
<body>
    <form action="/saveuser" method="post">
        姓名: <input name="userName" value="liuwanqing"/> <br/>
        年龄: <input name="age" value="20"/> <br/>
        宠物姓名:<input name="pet.name"/><br/>
        宠物年龄:<input name="pet.age"  />
        <input type="submit" value="保存"> 
    </form>
</body>
</html>

三、Controller 类

Post /saveuser 请求, 返回封装好的 Person 类

package com.example.demo2.controller;
import com.example.demo2.bean.Person;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParameterTestController {
    @PostMapping("/saveuser")
    public Person saveuser(Person person){
        return person;
    }
}

四、运行结果截图

提出问题二: SpringBoot 之所以可以自动获取表单值封装为指定类型对象,是因为SpringBoot 具有严密的参数解析机制, 但是若我们的输入值SpringBoot 不能解析时,难道我们就只能坐以待毙了嘛

回答: 不是,我们可以通过WebMvcConfigurer定制化SpringMVC的功能,通过重写 addFormatters 方法自定义类型参数

示例

如下表单中的 “huahua,5个月” 字符串是不能被 SpringBoot 解析为 Pet 类型的

    <form action="/saveuser" method="post">
        姓名: <input name="userName" value="liuwanqing"/> <br/>
        年龄: <input name="age" value="20"/> <br/>
        宠物:<input name="pet" value="huahua,5个月"/>
        <input type="submit" value="保存">
    </form>

自定义类型参数 封装POJO:

编写WebConfig类实现WebMvcConfigurer类,重写 addFormatters 方法

package com.example.demo2.config;
import com.example.demo2.bean.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer{
    //1、WebMvcConfigurer定制化SpringMVC的功能
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                registry.addConverter(new Converter<String, Pet>() {
                    @Override
                    public Pet convert(String source) {
                        if(!StringUtils.isEmpty(source)){
                            Pet pet = new Pet();
                            String[] split = source.split(",");
                            pet.setName(split[0]);
                            pet.setAge(split[1]);
                            return pet;
                        }
                        return null;
                    }
                });
            }
        };
    }
}

到此这篇关于SpringBoot自定义对象参数实现自动类型转换与格式化的文章就介绍到这了,更多相关SpringBoot自定义对象参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何获取真实请求IP

    Java如何获取真实请求IP

    这篇文章主要介绍了Java如何获取真实请求IP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java中RSA加密解密的实现方法分析

    Java中RSA加密解密的实现方法分析

    这篇文章主要介绍了Java中RSA加密解密的实现方法,结合具体实例形式分析了java实现RSA加密解密算法的具体步骤与相关操作技巧,并附带了关于RSA算法密钥长度/密文长度/明文长度的参考说明,需要的朋友可以参考下
    2017-07-07
  • springboot2+mybatis多种方式实现多数据配置方法

    springboot2+mybatis多种方式实现多数据配置方法

    这篇文章主要介绍了springboot2+mybatis多种方式实现多数据配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • mybatis中resulthandler的用法

    mybatis中resulthandler的用法

    这篇文章主要介绍了mybatis中resulthandler的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现Excel数据验证功能

    Java实现Excel数据验证功能

    在Java中,开发者可以使用一些开源的库(如Apache POI)来添加、修改和处理Excel中的数据,下面我们就来看看如何使用Java实现添加,修改和删除Excel数据验证吧
    2023-10-10
  • 详解Spring Cloud Gateway 数据库存储路由信息的扩展方案

    详解Spring Cloud Gateway 数据库存储路由信息的扩展方案

    这篇文章主要介绍了详解Spring Cloud Gateway 数据库存储路由信息的扩展方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Springboot整合策略模式详解

    Springboot整合策略模式详解

    这篇文章主要介绍了Springboot整合策略模式详解的相关资料,需要的朋友可以参考下
    2023-01-01
  • 在SpringBoot项目中如何实现线程池的动态监控

    在SpringBoot项目中如何实现线程池的动态监控

    Spring Boot因其简便、高效的特点广受开发者喜爱,在复杂的业务场景下,如何确保Spring Boot应用的高性能和稳定性成为了一个关键问题,其中,线程池的管理策略直接影响到系统的吞吐量和资源利用效率,本文将重点探讨在Spring Boot项目中,如何实现线程池的动态监控
    2023-10-10
  • Java详细讲解依赖注入的方式

    Java详细讲解依赖注入的方式

    Idea中使用@Autowire注解会出现提示黄线,强迫症患者看着很难受,使用构造器注入或者setter方法注入后可解决,下面我们一起来看看
    2022-06-06
  • 深入理解Java中的SPI机制

    深入理解Java中的SPI机制

    这篇文章主要介绍了深入理解Java中的SPI机制,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02

最新评论