热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot核心技术篇web开发2自定义pojo参数的封装和自定义Converter的原理

目录一、POJO封装过程二、原理分析1.执行方法2、封装参数​编辑3、初始化​编辑4、内置的转换器5、绑定pojo的值6、自定义转换器1、添加自定义converter

目录

一、POJO封装过程

二、原理分析

1.执行方法

2、封装参数 

​编辑3、 初始化

​编辑4、 内置的转换器

 5、绑定pojo的值

6、自定义转换器

1、添加自定义converter

2、原理

 总结




一、POJO封装过程

代码如下,然后进行测试,看看底层到底是如何封装POJO的

@Data
public class User {private String userName;private Integer age;private Dept dept;
}

@Data
public class Dept {private String deptName;private Integer code;
}

@ResponseBody@PostMapping("/save")public User saveUser( User user){System.out.println(user);return user;}

 然后我们直接利用postman的表达提交

 


二、原理分析


1.执行方法

进入处理器映射器对应的处理器适配器

 然后先将27种参数解析器和15种返回结果处理器加入进去

 接下来执行handle

 117行  执行这个方法


2、封装参数 

 获取请求参数  --也是我们主要看的,如何将参数自动封装到自定义的pojo中

 

自定义pojo是通过这个参数解析器进行解析 

通过这一步创建一个空的自定义pojo对象 


3、 初始化

进入初始化,得到一些转化器


4、 内置的转换器


 5、绑定pojo的值

 因为是Http文本,有很多格式的问题,因此doBind(mpvs)主要就是要将数据进行转换然后绑定

 

 

 

 进入到  setPropertyValues中

 遍历属性值,进行设置  

 设置值  真正的设置

 得到age的值 字符串15 然后进行设置

关键在这里

   判断是否需要转换

 先判断能不能进行转换

 成功进入  然后转换

获取一个转换器  要将String 转换为Integer类型的转换器

 

 查找对应的转换器

 

利用工具进行转换 

 

最终age从String变为 Integer

加载进去 

 

然后每个参数都这样设置即可 


WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);

WebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面

WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中

GenericConversionService:在设置每一个值的时候,找它里面的所有converter那个可以将这个数据类型(request带来参数的字符串)转换到指定的类型(JavaBean -- Integer)

byte -- > file



6、自定义转换器

如果我们想要进行自定义的类型转换。

例如:我不想使用dept.deptName的方式进行参数的封装

我向使用  一个dept传输   内容用,分割 类似于这样

 

 我们发现这样出现错误:它无法将这个dept中的字符串内容,封装到Dept类中

因此也就出现了我们自定义类型转换器的情况

原理的时候我们发现Converter转换器,是没有一个将String转换为Dept的因此我们要自定义写一个

即在WebMvcConfigurer中添加一个converter


1、添加自定义converter

package com.sofwin.config;import com.sofwin.pojo.Dept;
import com.sofwin.pojo.User;
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;/*** @packageName: com.sofwin.config* @user: wentao* @date: 2022/10/8 14:42* @email 1660420659@qq.com* @description: TODO*/
//声明是一个配置类
@Configuration
//继承WebMvcConfigurer
public class MvcConfig implements WebMvcConfigurer {//实现addFormattrs@Overridepublic void addFormatters(FormatterRegistry registry) {//在类型转换的注册中加入一个自定义Converterregistry.addConverter(new Converter() {@Overridepublic Dept convert(String source) {if (!StringUtils.isEmpty(source)){String[] split = source.split(",");Dept dept =new Dept();dept.setDeptName(split[0]);dept.setCode(Integer.parseInt(split[1]));return dept;}return null;}});}
}

加入过后访问就成功了

 




2、原理

我们打一个断点,看一看Converter是否加入,然后在看一看自定义的Converter是否执行即可

 

从124到125多了一个  就是这个我们自定义的String转换为Dept的转化器

 最终会进入到我们写的这个自定义转化器将带,分割的字符串装换为Dept

 


 总结

这个大概的原理就是这样,其实还是要自己进行debug走一走,效果能好一点,这里包含了很多的设计模式,多看源码对我们的编程是很有帮助的,Spring的源码,行业上是非常认可的


推荐阅读
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文深入探讨了在Spring Boot中处理RESTful风格的表单请求的方法,包括请求参数处理、请求映射以及RESTful设计原则的应用。文章详细介绍了如何利用HTTP动词(如GET、POST、PUT、DELETE)来操作资源,并结合Spring Boot的注解(如@GetMapping、@PostMapping等)实现高效、清晰的请求处理逻辑。通过实例分析,展示了如何在实际项目中应用这些技术,提高开发效率和代码可维护性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
author-avatar
独坤2602884605
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有