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

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

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

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

1. 简介

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

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

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

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

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

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

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

2. 实战案例

2.1 实现目标

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

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

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

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

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

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

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

2.3 注册格式化器

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

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

2.4 测试

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

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

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

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

2.5 用在字段上

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 梁柱接棒两年,腾讯音乐闯出新路子

    梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 自律,给不了Keep自由!

    自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 品牌洞察丨服务本地,美团直播成效几何?

    品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
Top
Baidu
map