序章

问题提出一:

当我们用表单获取一个 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自定义对象参数内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringBoot自定义对象参数实现自动类型转换与格式化的更多相关文章

  1. ios – Swift3上的“Empty collection literal需要显式类型”错误

    解决方法出现此错误,因为隐式转换被取消,因此您必须告诉编译器显式类型:

  2. ios – 无法将类型为’NSArray’的值分配给'[AnyObject]’类型的值

    在swift中,我有一个School类,它有一个类型为[AnyObject]的学生属性!是不是swift中的数组与目标c中的NSArray兼容?解决方法你的var学生是一个Swift数组,并期望AnyObject类型的对象,但你尝试为它分配一个NSArray.这两个对象的类型不同,不起作用.但是,鉴于NSArray与[AnyObject]兼容,您可以使用简单的类型转换将NSArray转换为Swift数组:当然,更好的方法是留在Swift世界并尽可能地忘记NSArray,方法是让getAllStudents

  3. Swift语法基础:9 - Swift的字面量, 类型转换, 类型别名

    在前面,我们介绍了Swift的一些基本东西,现在我们继续讲讲其他基础的东西:1.数值的字面量十进制数,没有前缀二进制数,前缀加0b八进制数,前缀加0o十六进制数,前缀加0x例子:2.指数十进制的指数这些也是十进制十六进制的指数3.数值类型的转换在Swift中的树枝类型转换要注意一些东西,那就是变量可存储的数据范围,比如无符号类型的数值不能存储负数,已经是最大值的类型不能再扩充,这些操作都会引起编译

  4. 老码说编程玩转swift读书笔记1

    而且即使实在32位机上,int的取值范围也从-2147483638到2147483647对大多数情况来说,这也够用了!varanInt:Int=10varaChar:Character="a"//编译时错误,加号运算符不支持左操作数为Int,右操作数为CharactervaranotherChar:Character=anInt+aChar//编译时错误,Character不能转换为IntvaranotherInt:Int=anotherChar其他非类型安全中,常见的变量或常量间的隐世类型转换,在swi

  5. Swift学习—数据类型

    知识点:指定常量\变量的数据类型Swift严格要求变量在使用之前必须进行初始化最值:可以使用min和max方法获得最值范围:数值超出存储范围Swift会报错类型不同的两个变量不能相加数字格式:可以增加零或者下划线增强可读性类型转换Swift中使用typealias关键字定义类型的别名,跟C中的typedef作用类似示例代码:

  6. swift 类型转换

    )!.doubleValue或者(display.text!

  7. Swift教程之typealias取代OC的typedef

  8. swift2 类型转换

    检查类型向下转型Any与AnyObject类型转换

  9. 简析Swift和C的交互

    之前好像简单说过Swift和Objective-C的交互问题。其实我们也可以用Swift调用纯C代码或者基于C的第三方库。)Swift官方文档中,以及那本已经被迅速翻译为中文的ibooks书中,都提到了Swift调用Objective-C和C是有很好支持的。本内容包括Swift调用C和相应的C调用Swift,项目混编。对于C来说,最头疼的莫过于指针,而Swift是一门没有指针的语言。这些标准库函数表示为Darwin.C.HEADER.name。实际上由于Swift模块结构是平坦的,他们均位于Darwin中

  10. Swift入门一——基本语法

    最近开始学习swift,把学习的过程和总结整理成一个系列,方便日后回顾总结。swift也支持print方法,与println不同的是,println在结尾会自动加上换行符,这与java的语法是一致的。swift中的基础类型有Int、Double、String、UInt8、Character、Bool等。Swift中所有的类型都是首字母大写的。答案是Double,因为swift具有宽类型优先的特性,也就是为自动推导为取值范围更宽泛的类型。附录查看完整专栏——《Swift轻松入门》

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部