Подтвердить что ты не робот

Почему проекция выдержки не применяется автоматически для ресурса элемента Spring Data REST?

Я сделал проекцию, которая должна выставлять вложенные объекты:

@Projection(name = "inlineBusiness", types = { UserModel.class })
public interface InlineBusinessUserModelProjection {

    String getUsername();

    String getFirstName();

    String getLastName();

    Date getBirthdate();

    String getEmail();

    BusinessModel getBusiness();
}

И сервис-репозиторий:

@RepositoryRestResource(collectionResourceRel = "users", path = "users",
       excerptProjection = InlineBusinessUserModelProjection.class)
public interface UserRepository extends BaseDAO<UserModel> {..}

для /users он отлично работает, бизнес-поле подвергается вложенному объекту, но когда я вызываю /users/1 - ничего, также все пользовательские методы.. Кажется, что проекция не задействована ни в каких методах, кроме /users Есть идеи?

4b9b3361

Ответ 1

Это работает так, как было разработано. Проекция вычитания используется всякий раз, когда экземпляр целевого типа (UserModel в вашем случае) используется внутри в предложении _embedded. Таким образом, выдержка является своего рода предварительным просмотром, используемым везде, где сам ресурс не отображается, а указывается на него. Обычно это происходит из ресурсов коллекции или для ассоциаций.

Использование проекции вычитания по умолчанию в ресурсе элемента на самом деле не имеет смысла с другой точки зрения: вычитания - это просмотр только для чтения на каком-либо объекте домена. Если вы вернете это представление для ресурса элемента по умолчанию, как клиент узнает, какие данные он должен был отправить для обновления ресурса. Документ JSON, созданный для проекции выдержки, не может быть просто взят, изменен и использован для отправки запроса PUT для обновления ресурса - по определению.

Если вы хотите применить проекцию к ресурсу элемента, заполните переменную шаблона projection URI с именем проекции.

EDIT: если проекции не применяются, если вы вручную их выбираете, убедитесь, что InlineBusinessUserModelProjection фактически зарегистрирован для общего использования. Убедитесь, что тип расположен в том же пакете или подпакетах UserModel.. Или вручную зарегистрируйте проекцию через RepositoryRestConfiguration.projectionConfiguration().addProjection(…). Ручная настройка делает использование @Projection для типа проекции устаревшим.

Подробнее об этой теме читайте в Spring справочной документации по данным REST.