У меня есть класс сущности «Сотрудник», Spring Data Rest возвращает всех сотрудников, когда я использую запрос Get на пути «../employees». По умолчанию он также создает ссылки на отношения @OneToMany. Например
"_links": {
"self": {
"href": "http://localhost:9000/mep/api/employees/1003"
},
"employee": {
"href": "http://localhost:9000/mep/api/employees/1003"
},
"assignmentProjectEmployeeSet": {
"href": "http://localhost:9000/mep/api/employees/1003/assignmentProjectEmployeeSet"
}
}
Является частью вывода. Теперь я отфильтровываю этот список по спецификациям в следующем классе.
@Service
public class EmployeeFilterService {
public Resources<Employee> getFilteredEmployees(Employee toBeFilteredEmployee) {
List<Employee> filteredEmployees = employeeRepository.findAll(
// filter stuff
);
List<Resource<Employee>> filteredEmployeesResources = new ArrayList<>();
for (Employee e : filteredEmployees) {
Resource<Employee> resource = new Resource<>(e);
filteredEmployeesResources.add(resource);
}
return new Resources(filteredEmployeesResources);
}
}
К сожалению, это не возвращает никаких ссылок. Я знаю, что могу добавлять ссылки вручную, но Spring Data Rest умеет создавать недостающие ссылки. Как я могу использовать это поведение по умолчанию?
Я читал что-то о PageResources, но не уверен, что это решение.
Спасибо за любую помощь Матиас
Вспомогательный фрагмент - Стратегия обнаружения:
Итак, согласно стратегии DEFAULT, вы можете попробовать добавить класс / интерфейс репозитория с помощью специального метода фильтрации, который также будет включен в ссылку.
Привет, Картик, я не уверен, правильно ли я понимаю, но моя проблема не в добавлении новой ссылки для одного из моих методов. Я получаю список сотрудников, и я хочу, чтобы Spring Data Rest добавлял все ссылки, которые будут созданы, когда я вызываю URL-адрес по умолчанию ... / employee
Колледж смог мне помочь. Я искал следующий код:
public Resources<PersistentEntityResource> filterEmployee(@RequestParam Map<String, String> requestParam, PersistentEntityResourceAssembler assembler) {
List<Employee> filteredList = employeeFilterService.getFilteredEmployees(requestParam);
List<PersistentEntityResource> resourceList = new ArrayList<>();
for (Employee e : filteredList) {
resourceList.add(assembler.toResource(e));
}
return new Resources<>(resourceList);
}
PersistentEntityResourceAssembler - это ключ, а класс нуждается в аннотации.
@RepositoryRestController
При этом создаются желаемые ссылки.
Матиас
Вы создали собственный контроллер / службу, поэтому вам нужно будет собрать ресурсы. Вы можете использовать встроенную поддержку QueryDSL, чтобы Spring Data Rest обрабатывал фильтрацию (то есть без настраиваемого контроллера или службы), и вы бы получили желаемый ответ, добавив параметры запроса, например.
/employees?surname=smith