自定义注解结合Jackson
虽然最终的解决方法挺简单的,不过解决问题过程还是挺有趣的,在此记录一下。
有时候我们希望我们自定义的注解同时拥有 Jackon 注解的功能。
例如我们有这么一个功能,需要自定义注解来标注类属性,来达到批量解析类属性的目的,而且并且我们希望被这个注解标志的属性不被 Json 序列化(不希望返回给前端)。通常情况下我们是不是会这么写
public class MyClass {
@CustomAnnotation // 我们自定义的注解
@JsonIgnore
private String myField;
}
如果这种需要被@CustomAnnotation标注的地方有很多,这么来写就显得很啰嗦麻烦了,那么有没有办法能够让@CustomAnnotation同时拥有@JsonIgnore的特性呢?这样只需要写一个注解就可以了。Jackson作为Springboot中使用广泛使用并且作为SoringBoot默认的Json解析框架来说肯定也是支持的。
1. 解决方法
在自定义注解上添加
@JacksonAnnotationInside注解,这样Jackson会把被@JacksonAnnotation标注的注解作为一个组合注解,并扫描该注解上的注解,这样我们在该注解上的Jackson相关的注解就会起作用。
有兴趣的可以看看下面解决的思路。
例如
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JsonIgnore
@JacksonAnnotationsInside // 标注为组合注解
public @interface CustomAnnotation {
}
2. 背景
起因是公司的一个项目,功能如下:
- 需要指定各种指标类,每一个指标都需要进行指标计算
- 这些指标类每一个都有各种类型不同、数量不同的配置
- 指标配置内容存储到数据库中
- 后端从数据库读取配置加载配置给指标后做指标计算。
- 最后将指标信息和计算结果返回给前端
首先指标不同的配置,数据类型不一定、数量不一定,如何做到指标易扩展,而且这些配置自动装配呢?
我的做法做一个注解,该注解控制配置解析逻辑,并且这些配置数据中间结果,不想暴露给前端,所以它也要具备 @JsonIgnore的功能。
3. 程序逻辑
定好逻辑后,我定义了自定义的注解,该注解标识了对应指标的配置在数据库配置的第几个位置,并在基础指标类中进行解析与设置指标配置。这样扩展子指标的时候只需要继承基础指标类并用注解标注怎么取配置,从而就可以专心写指标计算逻辑。
于是我定义的注解如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JsonIgnore
public @interface IndexParam {
/**
* 这个属性标识了被标识的Field所对应的配置在数据库参数配置中占第几个位置
*/
int value() default -1;
}
解析逻辑如下(基础指标BaseIndex中):
private void resetParam(ObjectArray config) {
// config 是从数据库解析到的配置列表,不是重点
// 扫描具有IndexParam注解的Field,设置值
BeanUtil.filterFieldAnnotation(

本文介绍了一种方法,使自定义注解能够同时具备Jackson注解的功能,具体实现了自定义注解@IndexParam,使其拥有@JsonIgnore特性,避免了序列化过程中敏感字段的暴露。
最低0.47元/天 解锁文章
207

被折叠的 条评论
为什么被折叠?



