Spring - RESTful предоставляет различные представления сущностей - PullRequest
1 голос
/ 27 июня 2019

Заранее я не говорю о Content Negotiation.Давайте предположим, что у меня есть простая сущность JPA, поскольку она может быть преобразована с помощью соответствующего DTO, это не имеет значения.

@Entity
public class User {

    ...
    private String email;
    private String password;
    ...
}

У меня есть контроллер RESTful с двумя разными маршрутами, защищенным иобщедоступный.

@RestController
public class UserController {

    ...

    @GetMapping("/public")
    private User publicRoute() {

        return service.getLatestUser();
    }

    @Secured("...")
    @GetMapping("/private")
    private User privateRoute() {

        return service.getLatestUser();
    }
}

Для обоих маршрутов возвращается одна и та же сущность, но в первом случае публичное представление, скажем, для профиля пользователя, без чувствительных элементов, таких как E-Mail и Пароль должен быть возвращен.Однако во втором случае требуется личное представление, скажем, для самого владельца.

Есть ли какой-нибудь элегантный способ сделать это?Я попробовал это на уровне JSON с @JsonIgnore, но у меня это не сработало.Также я пытался использовать Response -Objects, но это приводит к большому количеству шаблонного кода!Есть предложения?

См. Также: Рекомендовано Ananthapadmanabhan По этой теме уже существует несколько вопросов / ресурсов:

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

У вас могут быть разные объекты DTO, возвращаемые из двух конечных точек, вместо того, чтобы возвращать один и тот же класс Entity, чтобы вы могли контролировать, какие атрибуты должны быть в ответе.

Чтение здесь о преимуществах использования DTO .

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

0 голосов
/ 27 июня 2019

из Вопроса:

  1. В таблице базы данных вы можете иметь две роли
  2. Скажите как Пользователь и Владелец 3. В сервисе проверьте, является ли он пользователем или владельцем, и получитезатем необходимые данные имеют два DTO, для каждой из их информации, которую вы хотите отправить, установите информацию и вернитесь.
  3. Или у вас есть общий DTO, содержащий всю информацию и когда вы хотите просто отправить информацию о пользователе.игнорировать другую информацию {Подмножество} еще все.

Скажите, что вы думаете об этом решении?

0 голосов
/ 27 июня 2019

Игнорировать поля dto при отправке обратно в контроллер.

вы можете написать свой собственный метод, если ваш объект не является конечным приватным.); // отправляем только обязательные поля.}

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