• springboot 自定义 formatter 注解


    我们在开发时会用到 @DateTimeFormat 这个注解。

    对于从前台接收时间日期格式 很方便。

    但如果前台传来的是 "是" “否” “有” "无" 这样的中文时,想要转成boolean 类型时,没有对应的注解,下面我们自己来实现这个注解。

    本例基于

    springboot 2.x

    jdk1.8

    首先,创建一个注解

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
    public @interface BooleanFormat {
        String[] trueTag() default {};
    }

    其中 trueTag  用于接收参数

    比如我们想将 “YES”,“OK” 这样的字符串转成 true ,那需要在参数中进行表示 。

    然后,我们建一个formatter类,帮助我们来实现具体的转换规则。

     1 public class BooleanFormatter implements Formatter<Boolean> {
     2 
     3     private String[] trueTag;
     4 
     5 
     6     @Override
     7     public Boolean parse(String s, Locale locale) throws ParseException {
     8         if (trueTag != null && trueTag.length > 0) {
     9             return Arrays.asList(trueTag).contains(s);
    10         } else {
    11             switch (s.toLowerCase()) {
    12                 case "true":
    13                 case "1":
    14                 case "是":
    15                 case "有":
    16                     return true;
    17             }
    18         }
    19         return false;
    20     }
    21 
    22     @Override
    23     public String print(Boolean aBoolean, Locale locale) {
    24         return aBoolean ? "true" : "false";
    25     }
    26 
    27     public String[] getTrueTag() {
    28         return trueTag;
    29     }
    30 
    31     public void setTrueTag(String[] trueTag) {
    32         this.trueTag = trueTag;
    33     }
    34 }

    第3行的属性用来接收注解上传过来的参数。

    第7行的方法是用于将字符串转成BOOLEAN类型。

    第23行的方法用于将BOOLEAN类型转成字符串。

    完成上面的代码后,我们还需要将我们自定义的类型转类注册到spring中。

    先定义一下factory类。

     1 public class BooleanFormatAnnotationFormatterFactory extends EmbeddedValueResolutionSupport
     2         implements AnnotationFormatterFactory<BooleanFormat> {
     3 
     4 
     5     @Override
     6     public Set<Class<?>> getFieldTypes() {
     7         return new HashSet<Class<?>>(){{
     8             add(String.class);
     9             add(Boolean.class);
    10         }};
    11 
    12     }
    13 
    14     @Override
    15     public Printer<?> getPrinter(BooleanFormat booleanFormat, Class<?> aClass) {
    16         BooleanFormatter booleanFormatter = new BooleanFormatter();
    17         booleanFormatter.setTrueTag(booleanFormat.trueTag());
    18         return booleanFormatter;
    19     }
    20 
    21     @Override
    22     public Parser<?> getParser(BooleanFormat booleanFormat, Class<?> aClass) {
    23         BooleanFormatter booleanFormatter = new BooleanFormatter();
    24         booleanFormatter.setTrueTag(booleanFormat.trueTag());
    25         return booleanFormatter;
    26     }
    27 }

    然后将这个类注册到spring中。

     1 @Configuration
     2 public class WebConfigurer implements WebMvcConfigurer {
     3 
     4     
     5 
     6     @Override
     7     public void addFormatters(FormatterRegistry registry) {
     8         registry.addFormatterForFieldAnnotation(new BooleanFormatAnnotationFormatterFactory());
     9     }
    10 
    11     
    12 }

    接下来,就可以使用这个注解了。

    在你的pojo类中:

    1 @Data
    2 public class DemoDto {
    3     @BooleanFormat(trueTag = {"YES","OK","是"})
    4     private boolean exists;
    5 }
  • 相关阅读:
    OpenStack概述、虚拟机部署OpenStack
    foo bar 的典故
    PWA
    react 虚拟dom心得
    背包问题总结
    leetcode 44 通配符匹配(dp)
    黑客与画家
    njuoj 递归查询字符串
    我的第一篇博客
    接口测试入门(二)
  • 原文地址:https://www.cnblogs.com/eclipse-/p/10998269.html
Copyright © 2020-2023  润新知