Spring Boot中的角色基础Json输出

时间:2016-03-06 08:33:41

标签: json spring-mvc spring-boot jackson

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

示例:

public class Employee{

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

}

当用户拥有ROLE fieldForManagerOnly时,我想让manager仅在JSON输出中序列化。

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

2 个答案:

答案 0 :(得分:9)

我自己解决了这个问题。我使用了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);
}

答案 1 :(得分:0)

使用

注释字段
@JsonInclude(JsonInclude.Include.NON_NULL)

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