如何使用Spring EntityLinks创建指向/ profiles / {user-id} / job URI的REST链接?

时间:2019-05-09 11:06:12

标签: spring-boot spring-data-rest

我有一个控制器方法,负责返回一些数据以及客户端应用程序的有用链接。

@GetMapping(value = "/{uniqueId}")
@ResponseStatus(value = HttpStatus.OK)
public HttpEntity<UserProfileMinimalDto> getUserMinimal(@PathVariable String uniqueId) {
    UserProfileMinimalDto userDto = userProfileService.getProfileMinimal(uniqueId);
    userDto.add(
            entityLinks.linkToSingleResource(UserProfileController.class, uniqueId),
            linkTo(methodOn(UserJobController.class).getUserJobs(uniqueId)).withRel(REL_EXPERIENCES)
    );

另一个控制器

@RestController
@RequestMapping(PROFILES)
@ExposesResourceFor(UserJob.class)
public class UserJobController {

    @PostMapping(value = "/{uniqueId}"+"/job" )
    @ResponseStatus(value = HttpStatus.CREATED)
    public HttpEntity<UserJob> getUserJobs(@PathVariable String uniqueId) {
        System.out.println("user jobs");
        return new ResponseEntity<UserJob>(new UserJob(), HttpStatus.OK);
    }

}

这会给我返回链接:

"_links": {
    "self": {
        "href": "http://localhost:8085/api/v1/profiles/theCoder"
    },
    "experiences": {
        "href": "http://localhost:8085/api/v1/profiles/theCoder/job"
    }
}

但是我想使用EntityLinks获得相同的结果。可以看到,我已经将UserJobController作为UserJob资源公开,以便可以与EntityLinks一起使用 因此,我尝试了以下方法,但没有一个起作用。

entityLinks.linkFor(UserJob.class, uniqueId).withRel(REL_EXPERIENCES),
entityLinks.linkFor(UserJob.class, uniqueId, "/job").withRel(REL_EXPERIENCES)

但是他们两个都返回

"experiences": {
            "href": "http://localhost:8085/api/v1/profiles"
        }

我在这里做错了什么?还是EntityLinks不会以这种方式使用?

2 个答案:

答案 0 :(得分:0)

与其提供到单个资源(linkToSingleResource)的链接,不如尝试链接到特定方法:

Link link = linkTo(methodOn(UserJobController.class).getUserJobs("theCoder")).withSelfRel();

https://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.obtaining-links.builder.methods

答案 1 :(得分:0)

我找到了可以使用的正确API。这是一种可能的解决方案。

entityLinks.linkFor(UserJob.class, uniqueId).slash("/job").withRel(REL_EXPERIENCES)

注意:我不想使用控制器方法。