当前位置:首页 > 科技  > 软件

SpringBoot优雅定制接口参数格式转换

来源: 责编: 时间:2024-05-29 08:52:24 272观看
导读环境:SpringBoot3.2.51. 简介在Spring MVC中,数据类型的转换、自动绑定和格式化是一个非常强大的功能,Spring内置了非常多的数据类型转换器。如在一个HTTP请求中SpringMVC默认就具备将JSON个数的数据转换为Java对象,将一

环境:SpringBoot3.2.5a4W28资讯网——每日最新资讯28at.com

1. 简介

在Spring MVC中,数据类型的转换、自动绑定和格式化是一个非常强大的功能,Spring内置了非常多的数据类型转换器。如在一个HTTP请求中SpringMVC默认就具备将JSON个数的数据转换为Java对象,将一个字符串数字转换为Number类型等等。然而,Spring的默认数据绑定机制有时可能无法满足特定的业务需求,比如从特定格式的字符串中解析出自定义对象的实例。为了解决这个问题,Spring允许我们自定义注解和数据格式化器,以便在请求参数和Java对象之间进行自定义的转换。a4W28资讯网——每日最新资讯28at.com

本篇文章将结合如下需求讲解如何基于SpringBoot环境下自定义注解来实现数据的转换。a4W28资讯网——每日最新资讯28at.com

现有如下接口:a4W28资讯网——每日最新资讯28at.com

@GetMapping("/user")public User getUser(User user) {  return user ;}

请求url如下:a4W28资讯网——每日最新资讯28at.com

http://localhost:9001/api/objects/user?user=666,中国

在默认情况下,Spring是无法将这里的user参数值正确的绑定到User对象。a4W28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 实现目标

为了尽可能的简单,期望通过在接口请求参数上添加一个注解就能完成数据类型的转换及绑定。如下形式:a4W28资讯网——每日最新资讯28at.com

@GetMapping("/user")public User getUser(@UserFormat User user)

Spring提供了一种基于注解驱动的格式化,也就是上面这里看到的通过注解标注一个参数(字段)来实现数据的格式化。a4W28资讯网——每日最新资讯28at.com

要实现基于注解驱动的格式化,需要我们自定义类实现AnnotationFormatterFactory接口。该接口定义如下:a4W28资讯网——每日最新资讯28at.com

// 这里的泛型是注解类型,也就是我们要使用什么注解来标记我们的参数(字段)public interface AnnotationFormatterFactory<A extends Annotation> {  // 这个注解可以使用在什么字段上  Set<Class<?>> getFieldTypes();  // 将对象转换为String  Printer<?> getPrinter(A annotation, Class<?> fieldType);  // 将字符串解析为对象  Parser<?> getParser(A annotation, Class<?> fieldType);}

该接口非常的简单,主要就是如何将对象转String,如何从String转对象。a4W28资讯网——每日最新资讯28at.com

2.2 自定义注解格式化工厂

public class StringToUserFormatter implements AnnotationFormatterFactory<UserFormat> {    @Override    public Set<Class<?>> getFieldTypes() {      return Set.of(User.class) ;    }    @Override    public Printer<User> getPrinter(UserFormat annotation, Class<?> fieldType) {      return (object, locale) -> object.toString() ;    }    @Override    public Parser<User> getParser(UserFormat annotation, Class<?> fieldType) {      return (text, locale) -> {        Assert.hasText(text, "数据错误") ;        String[] s = text.split(",") ;        User user = new User() ;        user.setId(Long.parseLong(s[0])) ;        user.setName(s[1]) ;        return user ;      } ;    }  }

自定义注解:a4W28资讯网——每日最新资讯28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public static @interface UserFormat {}

有了以上的工厂类后,接下来是注册到Spring容器中。a4W28资讯网——每日最新资讯28at.com

2.3 注册格式化器

@Componentpublic class WebDataTypeConfig implements WebMvcConfigurer {  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addFormatterForFieldAnnotation(new StringToUserFormatter()) ;  }}

完成以上步骤就大功告成了,接下来测试a4W28资讯网——每日最新资讯28at.com

2.4 测试

@GetMapping("/user")public User getUser(@UserFormat User user) {  return user ;}

测试结果a4W28资讯网——每日最新资讯28at.com

图片图片a4W28资讯网——每日最新资讯28at.com

正确的转换为User对象。基于该注解进行格式化不仅仅只用到接口参数上,还可以用到字段上。a4W28资讯网——每日最新资讯28at.com

2.5 用在字段上

public static class DTO {  @UserFormat  private User user ;  private Integer age ;}

测试接口:a4W28资讯网——每日最新资讯28at.com

// 注意,可不要改成post,然后用@RequestBody。无用反而报错@GetMapping("/dto")public DTO save(DTO dto) {  return dto ;}

测试结果a4W28资讯网——每日最新资讯28at.com

图片图片a4W28资讯网——每日最新资讯28at.com

正确的输出结果。a4W28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91353-0.htmlSpringBoot优雅定制接口参数格式转换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python中的全局变量和局部变量详解

下一篇: 深入Go原理:协程间通信基础Chan

标签:
  • 热门焦点
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
Top