Spring Data Rest - 关联资源的自我链接

时间:2018-03-26 09:12:58

标签: java rest spring-data spring-data-jpa spring-data-rest

这是GET-Reqeust的JSON响应:

{
    ...
    "_links": {
        "self": {
             "href": "http://localhost:8080/persons/1"
         },
         "person": {
             "href": "http://localhost:8080/persons/1{?projection}",
             "templated": true
         },
         "anotherResource": {
             "href": "http://localhost:8080/persons/1/anotherResource"
         }
     }
}

问题是,我需要拥有“anotherResource”的自我链接。而不是:

 "href": "http://localhost:8080/persons/1/anotherResource"

我需要有类似的链接:

"href": "http://localhost:8080/anotherResources/2"

我知道我可以通过执行其他请求来实现它。但是这种解决方案在我的情况下是不实际的/可能的,我需要有大量的数据,并且对每个项目执行额外的请求并不好。

有任何建议/解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试将ResourceProcessorRepositoryEntityLinks一起使用来构建您需要的链接:

@Component
public class PersonResourceProcessor implements ResourceProcessor<Resource<Person>> {

    private RepositoryEntityLinks entityLinks;

    public PersonResourceProcessor(RepositoryEntityLinks entityLinks) {
        this.entityLinks = entityLinks;
    }

    @Override
    public Resource<Person> process(Resource<Person> resource) {
        Person person = resource.getContent();
        AnotherResource anotherResource = person.getAnotherResource()
        Link link = entityLinks.linkForSingleResource(anotherResource).withRel("anotherResource");
        resource.add(link);
        return resource;
    }
}

但请注意,因为如果资源person没有急切地嵌套anotherResource,您可以抓住LazyInitializationException(不确定,但请检查,请...)或每次person.getAnotherResource()次调用(the N+1 queries issue)都会向DB提供其他查询。这就是为什么使用诸如&#39; / persons / 1 / anotherResource&#39;之类的相对链接会更好。

答案 1 :(得分:0)

端点评论

您是否未使用@RequestMapping anotation声明REST端点?

我会尝试使用不同的@RequestMapping调用来定义不同的端点。

通过这种方式,程序可以为/persons提供一个RequestMapping,其中任何与人相关的操作都与其相应的端点相关联,并定义另一个&#34; root&#34; (强制引用,但你确定可以到达我要去的地方)/anotherresources的映射,你可以添加必要的端点。

响应处理

如果您只需要更改用户在访问GET端点时收到的JSON,您可以在实际将其发送回用户之前预先处理参数并更新JSON。

但是,当然,如果在不使用现有端点支持JSON中的参数的新值的情况下重写JSOn,则用户在尝试访问该URI时将遇到问题。如果您只需要形成JSON,我会假设/anotherresources的端点已经存在。

有关@RequestMapping的详细信息,请务必visit the Spring Docs website

我希望我能帮到你!