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?
Вы можете использовать фильтры свойств 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, элегантный подход.