这是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"
我知道我可以通过执行其他请求来实现它。但是这种解决方案在我的情况下是不实际的/可能的,我需要有大量的数据,并且对每个项目执行额外的请求并不好。
有任何建议/解决方案吗?
答案 0 :(得分:2)
您可以尝试将ResourceProcessor与RepositoryEntityLinks一起使用来构建您需要的链接:
@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。
我希望我能帮到你!