Проекции spring без spring data rest

spring-data-rest предоставляет фантастический способ определения вида объекта - проекции Spring. Мне любопытно, есть ли способ достичь аналогичной функциональности без использования spring-data-rest - просто репозитории и простые контроллеры отдыха.

Допустим, у меня есть сущность:

@Entity
public class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String firstname;
  private String lastname;

  // … 
}

и две конечные точки контроллера. Один должен вернуть полную сущность, а второй - единственное подмножество сущности (например, просто firstname, хотя реальный пример немного сложнее). По сути, я хотел бы избежать возврата вложенных коллекций с некоторых конечных точек.

Я знаю, что могу добиться этого, создав вторую сущность, указывающую на ту же таблицу, которая содержит только необходимые значения, но проблема в том, что мне также придется создать для нее отдельный репозиторий, и это создает много ненужных шаблонов.

Итак, мой вопрос: нужно ли мне иметь две сущности с двумя отдельными репозиториями или есть более элегантный способ сделать это в Spring?

1
0
580
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать фильтры свойств Spring, чтобы отфильтровать несколько полей из ответа на API:

@RequestMapping(...)
public MappingJacksonValue getUserEntities(...) 
    Page<UserEntity> entities = service.findAll();
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(entities);
    FilterProvider filters = new SimpleFilterProvider()
                .addFilter("UserEntity", SimpleBeanPropertyFilter
                        .filterOutAllExcept("fieldName"));
    mappingJacksonValue.setFilters(filters);
    return mappingJacksonValue;
}

Вы можете использовать Просмотры JSON, чтобы отфильтровать нужные вам поля. Вот такие Примеры.

В качестве альтернативы вы можете создать DTO вместо полного объекта, но это, IMHO, элегантный подход.

Другие вопросы по теме