【问题标题】:Hide/show field from Json response in spring boot on controller basis基于控制器在 Spring Boot 中隐藏/显示 Json 响应中的字段
【发布时间】:2020-10-24 12:11:40
【问题描述】:

我正在使用杰克逊和弹簧靴。我需要根据控制器显示/隐藏来自相同响应/请求模型的文件。 例如对于控制器 A,我需要显示该字段,而对于控制器 B,我需要隐藏它。两个控制器中使用的模型相同。 我尝试使用@JsonView,但它给 Swagger 文档带来了问题。 请帮忙

【问题讨论】:

标签: spring-boot jackson swagger response


【解决方案1】:

您可以在字段上使用自定义注释,即:接口@PleaseIgnoreThis,在您想要区别对待的每个字段上包含该注释,然后使用反射创建一个简单的方法以从响应中排除这些注释。

实体:

MyEnity {

    @PleaseIgnoreThis
    long id = 123;

    String name = "the name";

    String attr = "some value"

}

注解接口:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface PleaseIgnoreThis {}

示例方法:

Map<Object, Object> excludeTheseFromResponse(Object object) {
    Map<Object, Object>() map = new HashMap<>();
    for(Field f in object class) {
        if f does not have annotation PleaseIgnoreThis
            add it to the map (name, value)
    } 
    return map;
}

在控制器中:

@RequestMapping(value="/somePath/{maybe_some_id})
Object getSomeEntity(id) {
    return myRepository.findById(id));
}

返回 -> { “身份证”:123, “名称”:“名称”, “attr”:“一些价值” }

@RequestMapping(value="/somePath/{maybe_some_id})
Object getSomeEntity(id) {
    return excludeTheseFromResponse(myRepository.findById(id));
}

返回 -> { “名称”:“名称”, “attr”:“一些价值” }

注释可以包含一些额外的粒度值,并可用于根据授权或位置或一天中的时间更好地控制包含/排除的方式/内容...

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多