环境:Springboot2.6.12
通常,当需要实现通用类型转换逻辑时,可以使用转换器SPI 例如,用于在java.util.Date和Long之间转换。当你在客户端环境(如web应用程序)中工作并且需要解析和打印本地化字段值时,可以使用格式化程序SPI。ConversionService为两个SPI提供统一的类型转换API。
在Springboot环境下如何自定义数据类型的转换?
Formatter SPI 实现字段格式化逻辑非常简单,而且是强类型的。以下列表显示格式化程序接口定义:
package org.springframework.format;public interface Formatter<T> extends Printer<T>, Parser<T> {}
Formatter 从Printer和Parser构建块接口扩展而来。以下列表显示了这两个接口的定义:
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。注意确保格式化程序实现是线程安全的。
根据用户输入的信息,每个字段信息通过逗号分割,通过Formatter程序将其转换为Users对象。如输入:张三,30;将信息解析为Users对象姓名为张三,年龄为30。
public class Users { private String name ; private Integer age ;}
格式化程序:
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 ; }}
格式化程序定义完后,需要注册到系统中让系统能够知道如何进行转换。
@Configurationpublic class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new UsersFormatter()) ; } }
测试接口:
@GetMapping("/save")public Object save(Users users) { return users ;}
输出:
图片
可以按字段类型或注解配置字段格式。要将注解绑定到格式化程序,需要实现
AnnotationFormatterFactory。以下显示了AnnotationFormatterFactory接口的定义:
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);}
要创建实现,请执行以下操作:
参数化要与格式逻辑关联的字段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<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)) ; } }}
注册格式化程序。
@Configurationpublic 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<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() ; }}
接口:
@GetMapping("/save3")public Object save3(@UsersFormat Users users) { return users ;}
完毕!!!
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-10556-0.htmlSpring强大的数据格式化处理功能,你必须得知道
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 如何使用Python构建OTP验证系统?