【问题标题】:Role base Json output in Spring BootSpring Boot中的角色基础Json输出
【发布时间】:2016-06-19 21:10:38
【问题描述】:

是否可以根据定义的条件在 Spring Boot Rest 调用的输出中排除 JsonProperties? (例如用户的角色)

例子:

public class Employee{

    @JsonProperty
    private String name;
    @JsonProperty
    private String fieldForManagerOnly;
    @JsonProperty
    private String fieldForEmployeeOnly;

}

当用户具有角色manager 时,我希望仅在 JSON 输出中序列化 fieldForManagerOnly

我已经尝试过使用@JsonView 的解决方案(如Latest Jackson integration improvements in Spring 中所述),但该解决方案非常有限,因为@JsonView 绑定到一种控制器方法,而我只想使用一种控制器方法。

【问题讨论】:

    标签: json spring-mvc spring-boot jackson


    【解决方案1】:

    使用注释

    @JsonInclude(JsonInclude.Include.NON_NULL)
    

    如果当前用户不是经理,请确保将字段 fieldForManagerOnly 设置为 null

    【讨论】:

    • 我们有没有更好的方法来使用spring boot来实现它?
    【解决方案2】:

    我自己解决了这个问题。我使用了 JsonView 解决方案,但我从代码中选择了 JsonView 而不是注释。

    首先你需要一个视图接口。

    public class JsonViews {
    
        public  interface EmployeeView {}
        public  interface ManagerView {}
    
    }
    

    使用@JsonView 注解标记 Model 类中的字段。

    public class Employee{
    
        @JsonProperty
        private String name;
    
        @JsonView(JsonViews.ManagerView.class)
        private String fieldForManagerOnly;
    
        @JsonView(JsonViews.EmployeeView.class)
        private String fieldForEmployeeOnly;
    
    }
    

    在您的控制器中,根据角色(或其他条件)设置要使用的 JsonView:

    @RequestMapping(value = "/{employeeId}", method = RequestMethod.GET)
    public ResponseEntity<MappingJacksonValue> getEmployee(@PathVariable long employeeId) {
        Employee employee = employeeService.getEmployee(employeeId);
        MappingJacksonValue jacksonValue = new MappingJacksonValue(employeeResourceAssembler.toResource(employee));
    
        if (getRole().equals("MANAGER")) {
            jacksonValue.setSerializationView(JsonViews.ManagerView.class);
        } else if (getRole().equals("EMPLOYEE")) {
            jacksonValue.setSerializationView(JsonViews.EmployeeView.class);
        }
    
        return new ResponseEntity<>(jacksonValue, HttpStatus.OK);
    }
    

    【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2021-08-02
    • 2017-04-04
    • 1970-01-01
    • 2020-12-10
    • 2017-08-03
    • 1970-01-01
    • 2018-09-07
    • 2020-09-13
    相关资源
    最近更新 更多