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

Spring强大的数据格式化处理功能,你必须得知道

来源: 责编: 时间:2023-09-20 21:55:57 469观看
导读环境:Springboot2.6.12通常,当需要实现通用类型转换逻辑时,可以使用转换器SPI 例如,用于在java.util.Date和Long之间转换。当你在客户端环境(如web应用程序)中工作并且需要解析和打印本地化字段值时,可以使用格式化程序SPI

环境:Springboot2.6.1274r28资讯网——每日最新资讯28at.com

通常,当需要实现通用类型转换逻辑时,可以使用转换器SPI 例如,用于在java.util.Date和Long之间转换。当你在客户端环境(如web应用程序)中工作并且需要解析和打印本地化字段值时,可以使用格式化程序SPI。ConversionService为两个SPI提供统一的类型转换API。74r28资讯网——每日最新资讯28at.com

在Springboot环境下如何自定义数据类型的转换?74r28资讯网——每日最新资讯28at.com

Formatter SPI

Formatter SPI 实现字段格式化逻辑非常简单,而且是强类型的。以下列表显示格式化程序接口定义:74r28资讯网——每日最新资讯28at.com

package org.springframework.format;public interface Formatter<T> extends Printer<T>, Parser<T> {}

Formatter 从Printer和Parser构建块接口扩展而来。以下列表显示了这两个接口的定义:74r28资讯网——每日最新资讯28at.com

public interface Printer<T> {  String print(T fieldValue, Locale locale);}import java.text.ParseException;public interface Parser<T> {  T parse(String clientValue, Locale locale) throws ParseException;}

要创建自己的Formatter格式化程序,只需要实现上面的Formatter接口。将泛型T替换为需要格式化的对象类型 — 例如,java.util.Date。实现print()操作以打印T的实例以在客户端区域中显示。实现parse()操作,从客户端语言环境返回的格式化表示中解析T的实例。如果解析尝试失败,格式化程序应该抛出ParseException或IllegalArgumentException。注意确保格式化程序实现是线程安全的。74r28资讯网——每日最新资讯28at.com

自定义Formatter程序

根据用户输入的信息,每个字段信息通过逗号分割,通过Formatter程序将其转换为Users对象。如输入:张三,30;将信息解析为Users对象姓名为张三,年龄为30。74r28资讯网——每日最新资讯28at.com

public class Users {  private String name ;  private Integer age ;}

格式化程序:74r28资讯网——每日最新资讯28at.com

public class UsersFormatter implements Formatter<Users> {  @Override  public String print(Users object, Locale locale) {    if (Objects.isNull(object)) {      return "" ;    }    return "【name = " + object.getName() + ", age = " + object.getAge() + "】" ;  }  @Override  public Users parse(String text, Locale locale) throws ParseException {    if (text == null || text.trim().length() == 0) {      return null ;    }    Users user = new Users() ;    // 下面做简单处理,不做校验    String[] values = text.split(",") ;    user.setName(values[0]) ;    user.setAge(Integer.parseInt(values[1]));    return user ;  }}

格式化程序定义完后,需要注册到系统中让系统能够知道如何进行转换。74r28资讯网——每日最新资讯28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addFormatter(new UsersFormatter()) ;  }  }

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

@GetMapping("/save")public Object save(Users users) {  return users ;}

输出:74r28资讯网——每日最新资讯28at.com

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

基于注解的Formatter

可以按字段类型或注解配置字段格式。要将注解绑定到格式化程序,需要实现
AnnotationFormatterFactory。以下显示了AnnotationFormatterFactory接口的定义:
74r28资讯网——每日最新资讯28at.com

package org.springframework.format;public interface AnnotationFormatterFactory<A extends Annotation> {  Set<Class<?>> getFieldTypes();  Printer<?> getPrinter(A annotation, Class<?> fieldType);  Parser<?> getParser(A annotation, Class<?> fieldType);}

要创建实现,请执行以下操作:74r28资讯网——每日最新资讯28at.com

参数化要与格式逻辑关联的字段annotationType — 例如org.springframework.format.annoation.DateTimeFormat。74r28资讯网——每日最新资讯28at.com

  • getFieldTypes()返回可以使用注释的字段类型。
  • getPrinter()返回Printer以打印带注释字段的值。
  • getParser()返回一个Parser来解析带注释字段的值。

自定义注解格式化程序

自定义注解类,用来需要格式化的字段。74r28资讯网——每日最新资讯28at.com

@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})public @interface AgeFormat {}

自定义注解格式化程序。74r28资讯网——每日最新资讯28at.com

public final class AgeFormatAnnotationFormatterFactory        implements AnnotationFormatterFactory<AgeFormat> {  public Set<Class<?>> getFieldTypes() {    Set<Class<?>> types = new HashSet<Class<?>>() ;    types.add(Integer.class) ;    return types;  }  @Override  public Printer<Integer> getPrinter(AgeFormat annotation, Class<?> fieldType) {    return new AgeFormatter() ;  }  @Override  public Parser<Integer> getParser(AgeFormat annotation, Class<?> fieldType) {    return new AgeFormatter() ;  }    private class AgeFormatter implements Formatter<Integer> {    @Override    public String print(Integer object, Locale locale) {      if (object == null) {        return "" ;      }      return object.toString() ;    }        @Override    public Integer parse(String text, Locale locale) throws ParseException {      if (text == null || text.trim().length() == 0) {        return -1 ;      }      return Integer.parseInt(text.substring(1)) ;    }  }}

注册格式化程序。74r28资讯网——每日最新资讯28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addFormatterForFieldAnnotation(new AgeFormatAnnotationFormatterFactory()) ;  }}

Users.age字段添加注解。74r28资讯网——每日最新资讯28at.com

public class Users {  private String name ;  @AgeFormat  private Integer age ;}

测试接口。74r28资讯网——每日最新资讯28at.com

@GetMapping("/save2")public Object save2(Users users) {  return users ;}

74r28资讯网——每日最新资讯28at.com

注意这里的年龄前面加了一个‘s’字符。74r28资讯网——每日最新资讯28at.com

注解添加到参数上

格式化程序:74r28资讯网——每日最新资讯28at.com

public final class UsersFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<UsersFormat> {  public Set<Class<?>> getFieldTypes() {    Set<Class<?>> types = new HashSet<Class<?>>() ;    types.add(Users.class) ;    return types;  }  @Override  public Printer<?> getPrinter(UsersFormat annotation, Class<?> fieldType) {    return new UsersFormatter();  }  @Override  public Parser<?> getParser(UsersFormat annotation, Class<?> fieldType) {    return new UsersFormatter() ;  }}

接口:74r28资讯网——每日最新资讯28at.com

@GetMapping("/save3")public Object save3(@UsersFormat Users users) {  return users ;}

74r28资讯网——每日最新资讯28at.com


74r28资讯网——每日最新资讯28at.com

完毕!!!74r28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10556-0.htmlSpring强大的数据格式化处理功能,你必须得知道

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

上一篇: 如何使用Python构建OTP验证系统?

下一篇: 小心这个陷阱: 为什么JS中的 Every()对空数组总返回 True

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top