Разрешение на уровне свойств для ответов API REST [Java] - PullRequest
0 голосов
/ 23 сентября 2018

Если у меня есть bean-класс, представляющий таблицу, и ее данные возвращаются в ответ API.Этот API вызывается из нескольких клиентов с несколькими ролями и функциями, которые ограничивают видимость свойств.Я спрашиваю о способе или структуре, которые обрабатывают этот сценарий динамически.Например: - У нас есть пользовательская таблица:

------------------------------------------------------------------
|  id  |  f_name  |  l_name  | mobile  |  email    | birth_date  |
------------------------------------------------------------------
|  12  |  Ahmed   |  Adel    | 123456  |  a@a.com  | 01/02/90    |
------------------------------------------------------------------

- У нас есть bean-компонент, представляющий эту строку:

class User {
  private int id;
  private String fName;
  private String lName;
  private String mobile;
  private String email;
  private String bDate;
.
.
}

Так в API, например:

........ / ...... / user / 12

Ответ JSON может быть следующим:

{
  "id": 12,
  "fName": "Ahmed",
  "lName": "Adel",
  "mobile": "123456",
  "email": "a@a.com",
  "bDate": "01/02/90"
}

что необходимо,

* Если клиент является обычным пользователем, он должен получить следующий ответ:

{
  "id": 12,
  "fName": "Ahmed",
  "lName": "Adel",
  "mobile": null,
  "email": null,
  "bDate": null
}

* Если клиент является пользователем более высокого уровня, он может получить более подробную информацию.как ответ ниже:

{
  "id": 12,
  "fName": "Ahmed",
  "lName": "Adel",
  "mobile": "123456",
  "email": "a@a.com",
  "bDate": null
}

* Если клиент является администратором, он может получить полную информацию как ответ ниже:

{
  "id": 12,
  "fName": "Ahmed",
  "lName": "Adel",
  "mobile": "123456",
  "email": "a@a.com",
  "bDate": "01/02/90"
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Чистый способ сделать это будет с @JsonView аннотацией Джексона.

Определите виды:

public class UserViews {
    public static class Normal {}
    public static class High extends Normal {}
    public static class Admin extends High {}
}

Аннотируйте вашу модель:

class User {
    @JsonView(UserViews.Normal.class)
    private int id;
    @JsonView(UserViews.Normal.class)
    private String fName;
    @JsonView(UserViews.Normal.class)
    private String lName;
    @JsonView(UserViews.High.class)
    private String mobile;
    @JsonView(UserViews.High.class)
    private String email;
    @JsonView(UserViews.Admin.class)
    private String bDate;

    // getters and setters
}

И скажите Джексону, какое представление следует использовать для сериализации:

mapper.writerWithView(UserViews.Admin.class).writeValueAsString(user);

Вы можете инкапсулировать и централизовать логику того представления, которое Джексон должен использовать перед отправкой данных во внешний интерфейс.

0 голосов
/ 24 сентября 2018

Попробуйте jsonView @JsonView. Вот как вы можете его применить https://www.baeldung.com/jackson-json-view-annotation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...