【问题标题】:ResourceAssembler not returning the right path(created resource path) in response _linksResourceAssembler 没有在响应_links 中返回正确的路径(创建的资源路径)
【发布时间】:2019-05-15 19:37:40
【问题描述】:

我有一个控制器来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 是为其创建此作业的用户的 ID。 虽然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());

但我想在 DRY 原则中实现这一点,使用控制器类会阻止我使其变为 DRY。

有哪些替代方案/解决方案?

【问题讨论】:

    标签: spring-boot spring-data spring-data-rest spring-hateoas


    【解决方案1】:

    在资源处理器中,您将自链接设置为 UserJob 的 URL(您在控制器中设置的 /profiles)并连接 id,因此它变为“/profiles/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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多