繁体   English   中英

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

[英]Spring Data Rest - Self link of association resource

这是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"

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

有什么建议/解决方案吗?

您可以尝试将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()调用( 在N + 1个查询问题 )。 这就是为什么最好使用相对链接,例如“ / persons / 1 / anotherResource”。

端点评论

您是否没有使用@RequestMapping注释来声明REST端点?

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

这样,程序可以为/persons提供一个RequestMapping,其中任何与人相关的动作都与其相应的端点相关联,并为/anotherresources定义另一个“根”(强制引号,但是您肯定会到达我的/anotherresources )映射。您可以在其中添加必要的端点。

响应处理

如果您需要的只是更改用户在访问GET端点时收到的JSON,则可以对参数进行预处理并更新JSON,然后再将其实际发送回用户。

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

有关@RequestMapping的详细信息,请确保访问Spring Docs网站

希望我能对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM