解决包装返回结果,@JsonView过滤返回对象字段不生效问题

一、需求背景

当一个对象被多个接口复用当作返回结果的时候,可能存在不必要返回的字段,但同时当前项目大部分返回结果都是由包装类统一包装后返
回的,这个时候单纯的在对象内使用@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;

    // 省略 getter 和 setter
}

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;

    // 省略构造函数和 getter/setter
}

@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也不是万能的,有时候还是要不断尝试结合现有进行不断修改才能实现目标效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值