Spring Boot中的角色基础Json输出

use*_*372 3 json spring-mvc jackson spring-boot

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

例:

public class Employee{

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

}
Run Code Online (Sandbox Code Playgroud)

fieldForManagerOnly当用户拥有ROLE时,我希望在JSON输出中只有序列化manager.

我已经尝试了解决方案@JsonView(如Spring最新杰克逊集成改进中所述),但该解决方案非常有限,因为@JsonView绑定到一个控制器方法,我想只有一个控制器方法.

use*_*372 9

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

首先,您需要一个视图界面.

public class JsonViews {

    public  interface EmployeeView {}
    public  interface ManagerView {}

}
Run Code Online (Sandbox Code Playgroud)

使用@JsonView注释标记Model类中的字段.

public class Employee{

    @JsonProperty
    private String name;

    @JsonView(JsonViews.ManagerView.class)
    private String fieldForManagerOnly;

    @JsonView(JsonViews.EmployeeView.class)
    private String fieldForEmployeeOnly;

}
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,根据角色(或其他一些条件)设置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);
}
Run Code Online (Sandbox Code Playgroud)