我是SDR和Spring HATEOAS工具的初学者..
Spring Data REST采用Spring HATEOAS和Spring Data Neo4j的功能,并将它们自动组合在一起。
我的存储库是:
@RepositoryRestResource(collectionResourceRel = "entity", path = "entity")
public interface MyRepository extends GraphRepository<EntityBean>, RelationshipOperationsRepository<EntityBean>, PagingAndSortingRepository<EntityBean, Long>{}
我可以看到HATEOAS中有两个类可用于构建链接,例如:
ControllerLinkBuilder
和JaxRsLinkBuilder
如果我们通过Spring入门指南完成了大部分内容,它会显示Controller的示例。据我所知,两者都有两个不同的名称,即分别与Controller和JAX-RS服务创建链接。但是,当我尝试在我的REST服务中构建链接时:
EntityBean bean = myService.save(bean);
Resource<EntityBean> obj = new Resource<EntityBean>(bean);
obj.add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(TestResource.class).dummy("dummy")).withRel("entity"));
通过其中任何一个(即ControllerLinkBuilder
或JaxRsLinkBuilder
)它总是抛出异常:
java.lang.IllegalStateException: Could not find current request via RequestContextHolder
但是当我尝试手动添加它们时:
Link link = new Link("http://localhost:9090/amg-web/sdr/);
obj.add(link);
其中/amg-web/sdr/
是Servlet映射到RepositoryRestDispatcherServlet
并且它正常运行...以下输出为application/hal+json
响应类型:
{
_links: {
entity: {
href: "http://localhost:9090/amg-web/sdr/entity{?page,size,sort}"templated: true
}-
}-
}
所以** LinkBuilder肯定有问题..
我的问题是:
谢谢!
答案 0 :(得分:0)
好的,我想在某种程度上我找到了我的问题的答案:
关于java.lang.IllegalStateException
我在我的web.xml中遗失了Listner:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
GraphRepository
或PagingAndSortingRepository
等)用作自我探索机器。据我所知,Spring HATEOAS是Link构建机器,它使用我们的REST服务或Controller类来构建指定资源的链接。例如
Entity obj = repository.findByName(name);
Resource<Entity> resource = new Resource<Entity>(obj);
resource.add(JaxRsLinkBuilder.linkTo(TestResource.class).withRel("entity"));
return resource;
我认为这是为每个必需的实体bean手动创建链接和关系的唯一方法,在SDR的情况下,这是自动控制的。
为了验证或安全,我发现这个link很有用。但仍在尝试实施它。
我希望这对某人有帮助..如果可能的话,请随时更新或更正我的答案。感谢