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

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

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

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

1. 简介

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

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

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

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

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

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

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

2. 实战案例

2.1 实现目标

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

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

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

要实现基于注解驱动的格式化,需要我们自定义类实现AnnotationFormatterFactory接口。该接口定义如下:s6u28资讯网——每日最新资讯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转对象。s6u28资讯网——每日最新资讯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 ;      } ;    }  }

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

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

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

2.3 注册格式化器

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

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

2.4 测试

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

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

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

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

2.5 用在字段上

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top