在做接口对接的时候,转换数据会用到的一些注解进行记录;
1、SerializedName
使用Gson解析json成对象时默认的是将json里对应字段的值解析到java对象里对应字段的属性里面。然后我们经常会遇到我们 自己定义的java对象里的属性名跟json里的字段名是不一样的,这种情况怎么办呢,这时我们就可以使用@SerializedName注 解,来将对象里的属性跟json里字段对应值匹配起来。(入参可用)
例子: json: {"n":"张三"} —> SerializedName(value="n")
2、@JsonProperty
依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
@JsonProperty不仅仅是在序列化的时候有用,反序列化的时候也有用,比如有些接口返回的是json字符串,命名又不是标准的驼峰形式,在映射成对象的时候,将类的属性上加上@JsonProperty注解,
里面写上返回的json串对应的名字
3、@JSONField
讲到@JSONField 注解,就不得不提到Alibaba 开源的fasejson
fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快
// 配置date序列化和反序列使⽤yyyyMMdd⽇期格式
@JSONField(format="yyyyMMdd") public Date date;
4、@Data
作用于类上,(entity、pojo) lombok包,使用后可免写get&set&toString;
在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解;
原因查阅第5条。
5、EqualsAndHashCode
1. 此注解会生成equals(Object other) 和 hashCode()方法。
2. 它默认使用非静态,非瞬态的属性
3. 可通过参数exclude排除一些属性
4. 可通过参数of指定仅使用哪些属性
5. 它默认仅使用该类中定义的属性且不调用父类的方法
6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。
另:@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
修复此问题的方法很简单:
1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
6、@Table
常用的两个属性
name 用来命名 当前实体类 对应的数据库 表的名字
uniqueConstraints 用来批量命名唯一键
其作用等同于多个 @Column(unique = true)
@Table(name="an_user_table", uniqueConstraints = {
@UniqueConstraint(columnNames={"mobile", "email"})
})
@Table catalog和schema属性表示实体指定的目录名或是数据库名,这根据不同的数据库类型有所不同
使用@UniqueConstraints 可以定义表的唯一约束。
如果是联合约束就用下面这种
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})})
如果是单一字段约束可以用
@Table(name="tbl_sky",
uniqueConstraints = {@UniqueConstraint(columnNames="month")})
7、注解验证(应该都是spring的)
@Null 被注释的元素必须为null
@NotNull 被注释的元素不能为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内
8、出入参注解的使用
注解@JsonFormat主要是后台到前台的时间格式的转换
注解@DateTimeFormat主要是前后到后台的时间格式的转换
9、@JsonIgnoreProperties
@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段,可以满足当前的需要。这个注解还可以指定要忽略的字段。使用方法如下:
@JsonIgnoreProperties({ "internalId", "secretKey" })
指定的字段不会被序列化和反序列化