【发布时间】: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