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 }

原文地址:https://www.cnblogs.com/jc1997/p/11037571.html

时间: 2024-10-16 20:12:48

springboot 自定义 formatter 注解的相关文章

Springboot中使用自定义参数注解获取 token 中用户数据

使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类解析token中的用户信息 把解析结果存入到成员变量中 controller中通过TokenUtil工具类提供的静态方法获取用户信息 下面是过程示例代码 /*--------1.拦截器中获取---------*/ String token =request.getHeader("token"

SpringBoot自定义Filter

SpringBoot自定义Filter SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义Filter. 自定义Filter需要两个步骤: 实现Filter[javax.servlet.Filter]接口,实现Filter方法 添加 @Configuration 注解,将自定义Filter加入过滤链 [过滤打印请求URL]实例代码如下: package xatu.zsl.Filter; i

springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解.请求乱码解决.统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制.登录判断重定向.session时间设置 springboot + shiro 动态更新用户信息 基于前篇,新增功能: 新增shiro权限注解: 请求乱码问题解决: 统一异常处理. 源码已集成到项目中: github源码: https://githu

asp.net mvc3 数据验证(三)—自定义数据注解

原文:asp.net mvc3 数据验证(三)-自定义数据注解         前两节讲的都是asp.net mvc3预先设定的数据注解,但是系统自由的数据注解肯定不适合所有的场合,所以有时候我们需要自定义数据注解. 自定义数据注解有两种,一种是直接写在模型对象中,这样做的好处是验证时只需要关心一种模型对象的验证逻辑,缺点也是显而易见的,那就是不能重用. 还有一种是封装在自定义的数据注解中,优点是可重用,缺点是需要应对不同类型的模型. 现在我们以封装在自定义数据注解中的方法为例看下如何在asp.

XML序列化与反序列化+自定义XML注解框架XmlUtils

背景 前面一篇总结了Serializable的序列化与反序列化,现在接着总结XML.主要内容:XML基本的序列化与反序列化方法.一些注意事项.以及自定义了一个XML注解框架(简洁代码,解放双手). XML的序列化与反序列化 先与Serializable进行简单的对比: Serializable存储的文件,打开后无法正常查看,安全性高.xml文件可通过文本编辑器查看与编辑,可读性高(浏览器会格式化xml文件,更方便查看),安全性低: Serializable文件通过了签名,只能在自己的程序中反序列

springboot 定时任务@Scheduled注解

需要定时器的地方好像还挺多. 之前项目中有用到使用定时器循环订单时间,然后将超时的订单状态更改. springboot的@Scheduled注解能够很快速完成我们需要的定时任务. @Component public class ExampleTimer { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); /*每100秒执行一次*/ @Scheduled(fixedRate = 100000) public

SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地址信息address,每个用户可以有多量车car,类似如下结构 |-- user |-- address |-- carList |-- car1 |-- car2 二.对应的实体类如下 /省略setter/getter public class Address { private Long id;

springboot整合mybatis(注解)

springboot整合mybatis(注解) 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ht

jsr-303 参数校验—自定义校验注解

1.为什么要自定义? 通过上篇学习,了解到很多常用注解了,但是呢,总是有那么些需求.... 2.案例分析(手机号格式) 2.1.需要验证的实体 Bean public class LoginVo { @NotNull @IsMobile //自定义的注解 private String mobile; @NotNull @Length(min=32) private String password; //省略 get set 方法 } 2.2.自定义 IsMobile  注解类 import st