{
"_embedded" : {
"patient" : {
"firstName" : "Kidus",
"_links" : {
"self" : {
"href" : "http://localhost:8090/api/patients/2{?projection}",
"templated" : true
},
}
}
正如您所见,我有一个嵌入式实体(患者)。它返回包含实体链接的所有数据,但链接是模板化的。我没有使用前端HATEOAS客户端,我也不打算改变它的路线。所以我需要一个普通的非模板化链接。是否有任何非黑客的方法来实现这一目标?
答案 0 :(得分:0)
您可以通过以下方式强制扩展模板:
@GetMapping("/myresources/{id}")
public EntityModel<MyResource> myResource(String id) {
MyResource resource = ...;
return new EntityModel<>(
resource,
linkTo(methodOn(getClass()).myResource(id)).withSelfRel().expand(id));
}
答案 1 :(得分:0)
您可以使用自定义 RepresentationModelProcessor
修改 self
链接:
@Component
public class MyProjectionProcessor implements RepresentationModelProcessor<EntityModel<MyProjection>> {
private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\{\\?.*");
@Override
public EntityModel<MyProjection> process(final EntityModel<MyProjection> model) {
// copy the model without links
final EntityModel<MyProjection> newModel = EntityModel.of(model.getContent());
// loop over links
for (final Link link : model.getLinks()) {
Link newLink = link;
// replace self link if it is templated
if (link.hasRel(IanaLinkRelations.SELF) && link.isTemplated()) {
final String href = TEMPLATE_PATTERN.matcher(link.getHref()).replaceFirst("");
newLink = Link.of(href, IanaLinkRelations.SELF);
}
newModel.add(newLink);
}
return newModel;
}
}