#spring #spring-boot #spring-mvc #spring-hateoas
Вопрос:
В моем весеннем проекте HATEOAS я отправляю следующий URI для запроса GET,
http://localhost:8080/emp_db/api/v4/employees/?firstName=Tom
Но ссылка в ответе отображается следующим образом,
_links": {
"employees": {
"href": "http://localhost:8080/emp_db/api/v4/employees/{?firstName,lastName,email}",
"templated": true
}
}
Похоже, что параметры запроса отображаются внутри в виде переменной пути. Правильно ли это? Я ожидал, что ссылка будет больше похожа,
http://localhost:8080/emp_db/api/v4/employees/?firstName=Tom,lastName=,email=
Мой код выглядит следующим образом,
@GetMapping
public CollectionModel<EntityModel<Employee>> get(@RequestParam Optional<String> firstName,
@RequestParam Optional<String> lastName,
@RequestParam Optional<String> email) {
LOGGER.trace("Getting employees: {} {} {}", firstName, lastName, email);
return CollectionModel.of(employeeService.findByFieldsLike(firstName, lastName, email)
.stream()
.map(assembler::toModel)
.collect(Collectors.toList()),
linkTo(methodOn(APIControllerV4.class)
.get(Optional.empty(), Optional.empty(), Optional.empty()))
.withRel("employees"));
}
@GetMapping("/{id}")
public EntityModel<Employee> get(@PathVariable long id) {
LOGGER.trace("Getting employee: {}", id);
return employeeService.findById(id)
.map(assembler::toModel)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,
String.format("Employee %d not found", id)));
}
Override
public EntityModel<Employee> toModel(Employee entity) {
return EntityModel.of(entity, linkTo(methodOn(APIControllerV4.class).get(entity.getId())).withSelfRel(),
linkTo(methodOn(APIControllerV4.class)
.get(Optional.empty(), Optional.empty(), Optional.empty()))
.withRel("employees"));
}