ResourceAssembler не возвращает правильный путь (созданный путь ресурса) в ответных _ _links - PullRequest
0 голосов
/ 15 мая 2019

У меня есть контроллер для 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());

Но я хочу реализовать это в принципе СУХОЙ, и использование классов контроллера не позволит мне сделать его СУХИМЫМ.

Какие есть альтернативы / решения?

1 Ответ

2 голосов
/ 16 мая 2019

В процессоре ресурсов вы устанавливаете собственную ссылку на URL для UserJob (/ profile, который вы установили в своем контроллере) и объединяете id, так что он становится "/ profile / id".

Если вам нужно установить ссылку на URL-адрес метода, ControllerLinkBuilder - лучший вариант, чтобы избежать жесткого кодирования URL-адресов (что будет необходимо, если вы используете EntityLinks):

@PostMapping(value = "/{uniqueId}/jobs")
public Resource<UserJob> createJob(@Valid @RequestBody UserJob userJob, final Principal principal, @PathVariable String uniqueId) {

    UserJob userJob = userJobService.save(userJob, principal.getName(), uniqueId);
    return toResource(userJob);

}

private Resource<UserJob> toResource(UserJob userJob) {
    Link selfLink = linkTo(methodOn(UserJobController.class)
        .getSingleJob(/* values */))
        .withSelfRel();

    return new Resource<>(userJob, selfLink);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...