2016-03-06 4 views
3

Можно ли исключить JsonProperties на выходе вызова Spring Boot Rest на основе определенного условия? (Например, роль пользователя.)Роль базы Json output в Spring Boot

Пример:

public class Employee{ 

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

} 

Я хочу иметь fieldForManagerOnly только сериализованную на выходе JSON, когда пользователь имеет РОЛИ manager.

Я уже пробовал решение с @JsonView (как описано в Latest Jackson integration improvements in Spring), но это решение очень ограничено, поскольку @JsonView связан с одним из методов Controler, и я хочу иметь только один метод контроллера.

ответ

7

Я сам решил проблему. Я использовал решение JsonView, но вместо аннотации я выбираю JsonView из кода.

Сначала вам нужен интерфейс для представлений.

public class JsonViews { 

    public interface EmployeeView {} 
    public interface ManagerView {} 

} 

Отметьте поля в классе модели аннотациями @JsonView.

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); 
} 
+0

Это хорошее решение, что я не знаю, о. У тебя есть мой взлет. –

+0

Как и к моему обходному пути здесь: https://stackoverflow.com/questions/29838960/how-to-dynamically-remove-fields-from-a-json-response/30133798#30133798 – Riggs

0

Annotate поле с

@JsonInclude(JsonInclude.Include.NON_NULL) 

и убедитесь, чтобы установить поле fieldForManagerOnly в null, если текущий пользователь не является менеджером.

Смежные вопросы