一、需求背景
当一个对象被多个接口复用当作返回结果的时候,可能存在不必要返回的字段,但同时当前项目大部分返回结果都是由包装类统一包装后返
回的,这个时候单纯的在对象内使用@JsonView就无法过滤字段了,为解决这个问题记录当前解决方法
二、问题分析记录
当前项目使用了Feigin结构,也就是Controller实际也是在调用一个接口,这种情况我尝试过将@JsonView注释放在Feigin和Controller
上在类内部声明过滤。结果发现当直接放在Controller上面的时候会返回空 {} ,放在Feigin上面的时候还是返回整个对象但是其实过滤的
字段不管有没有值都会是个Null。调整思路将返回包装结果也进行控制
三、实现
public class Views {
public static class Public { }
public static class Internal extends Public { }
}
public class MyObject {
@JsonView(Views.Internal.class)
private String publicField;
@JsonView(Views.Internal.class)
private String internalField;
}
public class ApiResponse<T> {
@JsonView(Views.Public.class)
private boolean success;
@JsonView(Views.Public.class)
private T data;
@JsonView(Views.Public.class)
private String message;
}
@RestController
public class MyController {
@GetMapping("/objects")
@JsonView(Views.Internal.class)
public ApiResponse<List<MyObject>> getObjects() {
List<MyObject> objects =
ApiResponse<List<MyObject>> response = new ApiResponse<>();
response.setSuccess(true);
response.setData(objects);
return response;
}
}
三、总结
ChatGPT也不是万能的,有时候还是要不断尝试结合现有进行不断修改才能实现目标效果