Java 如何通过自链接在SpringDataREST服务器中加载实体?

Java 如何通过自链接在SpringDataREST服务器中加载实体?,java,spring,spring-data-rest,Java,Spring,Spring Data Rest,给定使用构建的(SDR)服务器,是否可以在服务器应用程序中通过自链接加载@实体 我知道如何使用HTTP客户端访问它,例如使用curl: $ curl localhost/users/1 # Responds with 200 OK and JSON representation 我要搜索的是一种仅使用Java在服务器上执行此操作的机制,理想情况下使用标准SDR机制: @Service public class SelfLinkResolver { public Object find

给定使用构建的(SDR)服务器,是否可以在服务器应用程序中通过自链接加载
@实体

我知道如何使用HTTP客户端访问它,例如使用curl:

$ curl localhost/users/1 # Responds with 200 OK and JSON representation
我要搜索的是一种仅使用Java在服务器上执行此操作的机制,理想情况下使用标准SDR机制:

@Service
public class SelfLinkResolver {

    public Object findBySelfLink(Link self) {
        if (self == null || !self.getRel().equals(SELF)) {
            throw new IllegalArgumentException("Non-null self link expected");
        }
        return null; // How to return the entity using a standard SDR mechanism?
    }

    public void exampleCall() {
        Link self = new Link("localhost/users/1");
        Object entity = findBySelfLink(self);
        requireNonNull(entity, "Failed to load entity by self link");
    }

}

内部解决方案是解析链接并提取ID(在示例中为1),调用
repository.findById(ID)


另一个解决方案是一个新的
RestTemplate
,调用您自己的API。

我终于想出了这个解决方案,它使用SDR的
UriToEntityConverter
。与我的问题相反,它不仅需要自链接,还需要实体类。因此,它不能完全回答我最初的问题

我想没有不需要实体类的SDR解决方案,因为在框架中不需要实体类,至少对于通常的API调用是这样。SDR总是通过自链接引用的
存储库
提供类型信息。但是,我没有深入研究其他类,如
persistentenenties
RepositoryInvokerFactory
存储库
,它们可能会提供解决方案

警告:我的测试实现与此不同。这段代码未经测试,但应该能说明这一点。

import lombok.NonNull;
导入org.springframework.core.convert.TypeDescriptor;
导入org.springframework.data.mapping.context.PersistentEntities;
导入org.springframework.data.repository.support.Repositories;
导入org.springframework.data.repository.support.RepositoryInvokerFactory;
导入org.springframework.data.rest.core.UriToEntityConverter;
导入org.springframework.hateoas.Link;
导入org.springframework.stereotype.Component;
导入java.net.URI;
导入java.util.Optional;
导入静态com.google.common.base.premissions.checkArgument;
导入静态java.lang.String.format;
导入静态org.springframework.hateoas.IanaLinkRelations.SELF;
@组成部分
公共类SelfLinkToEntityConverter扩展了UriToEntityConverter{
私有静态最终类型描述符URI\u DESCRIPTOR=TypeDescriptor.valueOf(URI.class);
SelfLinkToEntityConverter(@NonNull PersistentEntity实体,
@非Null RepositoryInvokerFactory invokerFactory,
@非空存储库(存储库){
超级(实体、invokerFactory、存储库);
}
@非空
公共可选findBySelfLink(@NonNull-Link-self,@NonNull-Class-entityClass){
checkArgument(self.getRel().equals(self),“应为非空的自链接”);
URI=self.expand().toUri();
TypeDescriptor TypeDescriptor=TypeDescriptor.valueOf(entityClass);
试一试{
@抑制警告(“未选中”)
T entity=(T)super.convert(uri、uri\U描述符、typeDescriptor);
返回可选。不可用(实体);
}捕获(IllegalArgumentException o_o){
抛出新的IllegalArgumentException(格式(“加载%s失败:%s”),
entityClass.getSimpleName(),self.getHref());
}
}
}

谢谢你的建议。几个月前,我实现了第一个启动并运行它的工具。调用自己的API对我来说太贵了。但据我所知,这两种解决方案都是权宜之计,而不是合适的内置SDR标准。@a链接URI
“localhost/users/1”
来自哪里?应用程序是内部的还是外部的?如果是内部的,则必须有一个包含ID的对象。它只是一个外部
字符串
。上下文中没有类型信息。没有这样的SDR标准解决方案来处理从外部传递的URI。然后你应该仔细考虑你的数据流。也许ID比URI字符串更好。也许对象的某些必需值(在本例中为用户)比URI字符串更好。必须有这样的解决方案,因为SDR需要一个来完成这项工作。这就是为什么我想重复使用它。事实上,在深入研究SDR代码之后,我找到了一个解决方案,我只是不知道它是否有黑客行为。我会把它贴在这里。但是,它需要上下文中的类型信息。