背景描述
一般Http接口,为了参数统一管理,定义一个VO用来接收POST过来的字段,常规做法是把参数解析成map,然后反序列化到VO中,早期定义的接口字段都非空,所以VO中都加了@NonNull注解;一直很和谐;
因为需求变化,接口字段需要增加两个,为了版本兼容,新加的两个字段需要可空;于是在VO中增加两个字段,不用@NonNull修饰,但是反序列化后发现这两个字段一直为空!怎么都不能从map中获取到这两个值!
分析
版本:
JDK:1.8
lombok:1.18.12
fastjson:1.2.60
原代码
package com.example.demo;
import lombok.Data;
import lombok.NonNull;
@Data
public class DemoRequestVO {
@NonNull
private String firstParam;
private String SecondParam;
private String thirdParam;
}
public static void testDemo(){
Map<String, String> params = new HashMap<>();
params.put("firstParam","lllllll");
params.put("secondParam","45454645");
params.put("thirdParam","xx公司");
DemoRequestVO request = JSON.parseObject(JSON.toJSONString(params), DemoRequestVO.class);
System.out.println(request);
}
分析原因
做两方面猜测:
1: 注解提供者问题
2: Json反序列化问题
1: 先看下: 注解提供者 @NonNull
发现其是作用于RetentionPolicy.CLASS的
package lombok;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({
ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface NonNull {
}
查看lombok源码可以看到,NonNull注解提供者一共这么多
static {
NONNULL_ANNOTATIONS = Collections.unmodifiableList(Arrays.