文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-30 08:00

关注

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

在Springboot环境下如何自定义数据类型的转换?

Formatter SPI

Formatter SPI 实现字段格式化逻辑非常简单,而且是强类型的。以下列表显示格式化程序接口定义:

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

Formatter 从Printer和Parser构建块接口扩展而来。以下列表显示了这两个接口的定义:

public interface Printer {
  String print(T fieldValue, Locale locale);
}
import java.text.ParseException;


public interface Parser {
  T parse(String clientValue, Locale locale) throws ParseException;
}

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

自定义Formatter程序

根据用户输入的信息,每个字段信息通过逗号分割,通过Formatter程序将其转换为Users对象。如输入:张三,30;将信息解析为Users对象姓名为张三,年龄为30。

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

格式化程序:

public class UsersFormatter implements Formatter {
  @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 ;
  }


}

格式化程序定义完后,需要注册到系统中让系统能够知道如何进行转换。

@Configuration
public class WebConfig implements WebMvcConfigurer {


  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new UsersFormatter()) ;
  }
  
}

测试接口:

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

输出:

图片

基于注解的Formatter

可以按字段类型或注解配置字段格式。要将注解绑定到格式化程序,需要实现
AnnotationFormatterFactory。以下显示了AnnotationFormatterFactory接口的定义:

package org.springframework.format;


public interface AnnotationFormatterFactory {


  Set> getFieldTypes();


  Printer getPrinter(A annotation, Class fieldType);


  Parser getParser(A annotation, Class fieldType);
}

要创建实现,请执行以下操作:

参数化要与格式逻辑关联的字段annotationType — 例如org.springframework.format.annoation.DateTimeFormat。

自定义注解格式化程序

自定义注解类,用来需要格式化的字段。

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

自定义注解格式化程序。

public final class AgeFormatAnnotationFormatterFactory
        implements AnnotationFormatterFactory {
  public Set> getFieldTypes() {
    Set> types = new HashSet>() ;
    types.add(Integer.class) ;
    return types;
  }


  @Override
  public Printer getPrinter(AgeFormat annotation, Class fieldType) {
    return new AgeFormatter() ;
  }


  @Override
  public Parser getParser(AgeFormat annotation, Class fieldType) {
    return new AgeFormatter() ;
  }
  
  private class AgeFormatter implements Formatter {
    @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)) ;
    }
  }


}

注册格式化程序。

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

Users.age字段添加注解。

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

测试接口。

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

注意这里的年龄前面加了一个‘s’字符。

注解添加到参数上

格式化程序:

public final class UsersFormatAnnotationFormatterFactory implements AnnotationFormatterFactory {
  public Set> getFieldTypes() {
    Set> types = new HashSet>() ;
    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() ;
  }


}

接口:

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


完毕!!!

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯