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

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

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

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

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

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

Formatter SPI

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

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

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

自定义Formatter程序

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

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

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

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

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

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

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

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

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

基于注解的Formatter

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

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

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

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

自定义注解格式化程序

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

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

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

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

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

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

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

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

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

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

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

注解添加到参数上

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

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

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

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


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

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

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

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

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

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

标签:
  • 热门焦点
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top