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

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

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

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

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

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

Formatter SPI

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

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

Formatter 从Printer和Parser构建块接口扩展而来。以下列表显示了这两个接口的定义:78J28资讯网——每日最新资讯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。注意确保格式化程序实现是线程安全的。78J28资讯网——每日最新资讯28at.com

自定义Formatter程序

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

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

格式化程序:78J28资讯网——每日最新资讯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 ;  }}

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

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

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

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

输出:78J28资讯网——每日最新资讯28at.com

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

基于注解的Formatter

可以按字段类型或注解配置字段格式。要将注解绑定到格式化程序,需要实现
AnnotationFormatterFactory。以下显示了AnnotationFormatterFactory接口的定义:
78J28资讯网——每日最新资讯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);}

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

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

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

自定义注解格式化程序

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

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

自定义注解格式化程序。78J28资讯网——每日最新资讯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)) ;    }  }}

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

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

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

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

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

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

78J28资讯网——每日最新资讯28at.com

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

注解添加到参数上

格式化程序:78J28资讯网——每日最新资讯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() ;  }}

接口:78J28资讯网——每日最新资讯28at.com

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

78J28资讯网——每日最新资讯28at.com


78J28资讯网——每日最新资讯28at.com

完毕!!!78J28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

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