У меня есть контроллер для POST
заданий пользователя.При успешном создании ответ должен содержать ссылку на созданный ресурс.Для этого я написал ниже ResourceAssembler
public class UserJobResourceAssembler implements ResourceAssembler<UserJob, Resource<UserJob>> {
private EntityLinks entityLinks;
public UserJobResourceAssembler(EntityLinks entityLinks) {
this.entityLinks = entityLinks;
}
@Override
public Resource<UserJob> toResource(UserJob entity) {
Resource<UserJob> resource = new Resource<>(entity);
resource.add(
entityLinks.linkToSingleResource(UserJob.class, entity.getId()).withSelfRel()
);
return resource;
}
}
И это контроллер
@RequestMapping(value = "/profiles" )
@ExposesResourceFor(UserJob.class)
public class UserJobController {
private UserJobService userJobService;
public UserJobController(UserJobService userJobService) {
this.userJobService = userJobService;
}
@PostMapping(value = "/{uniqueId}/jobs")
public Resource<UserJob> createJob(@Valid @RequestBody UserJob userJob, final Principal principal, @PathVariable String uniqueId) {
return userJobService.save(userJob, principal.getName(), uniqueId);
}
@GetMapping(value = "/{uniqueId}" + JOBS + "/{jobId}")
@ResponseStatus(value = HttpStatus.CREATED)
public Resource<UserJob> getSingleJob(@PathVariable String uniqueId, @PathVariable String jobId) {
System.out.println("get single job for job id: " + jobId);
return new Resource<UserJob>(new UserJob());
}
}
uniqueId
- это идентификатор пользователя, для которого создается это задание.Хотя ResourceAssembler
создает ссылку, но неправильную.
"_links": {
"self": {
"href": "http://localhost:8085/api/v1/profiles/12"
}
}
Я ожидал, что она будет http://localhost:8085/api/v1/profiles/theCoder/jobs/12
Я знаю, что это не проблема с ResourceAssembler
, а сEntityLinks
.И это можно решить, используя linkTo
вместо EntityLinks
resource.add(linkTo(methodOn(UserJobController.class).getSingleJob(entity.getUser().getUniqueId(), entity.getUserJobId().toString())).withSelfRel());
Но я хочу реализовать это в принципе СУХОЙ, и использование классов контроллера не позволит мне сделать его СУХИМЫМ.
Какие есть альтернативы / решения?