【发布时间】:2020-09-14 02:18:56
【问题描述】:
我在使用 Spring Data Rest (3.2.6.RELEASE) 的 Spring Boot 应用程序 (2.2.6.RELEASE) 中遇到了一个奇怪的问题。有时我的存储库不会通过休息暴露。使用完全相同的配置,我的应用程序的完全相同的版本(相同的 jar)会发生这种情况。
有 4 个@RepositoryRestResource,当它工作时,根资源会暴露这个:
{
"_links": {
"entity-a": {
"href": "http://localhost:8080/api/entity-a{?projection}",
"templated": true
},
"entity-b": {
"href": "http://localhost:8080/api/entity-b"
},
"entity-c": {
"href": "http://localhost:8080/api/entity-c{?page,size,sort,projection}",
"templated": true
},
"entity-d": {
"href": "http://localhost:8080/api/entity-d"
},
"profile": {
"href": "http://localhost:8080/api/profile"
}
}
}
当它不工作时它会返回:
{
"_links": {
"profile": {
"href": "http://localhost:8080/api/profile"
}
}
}
一些额外的发现:
- JPA 组件扫描在两种情况下都有效
- 存储库本身在这两种情况下都可以正常工作,使用这些存储库的自定义控制器可以正常工作
- 为
org.springframework.data启用调试日志记录会在两种情况下产生完全相同的输出 - 比较来自执行器端点的响应没有显示任何明显的差异
- 存储库检测策略显式设置为
RepositoryDetectionStrategies.ANNOTATED - 我无法在 SSCE 中重现它
- 模块已从 Spring Boot 1.5.18 升级,升级后开始出现此问题。
以前有没有其他人遇到过这个问题?这可能是什么原因造成的?或者一些关于如何进一步分析这个问题的指针?
【问题讨论】:
-
似乎 RepositoryRestResource 存在问题,当您在
both scenarios中说时,您的意思是重启后会中断?或者它也可以在运行时发生?一个不错的选择是跟踪和调试针对任何发现的实体/服务创建映射的代码片段,以交叉检查您那里没有库不匹配 -
@AntJavaDev 是的,这是一个启动/上下文加载问题,它在运行时永远不会改变。我尽可能多地尝试跟踪/调试,但在我看来,这归结为找到了
org.springframework.data.repository.core.support.RepositoryFactoryInformation,这两种情况下的所有四个存储库都应该是这种情况。我也想到了库不匹配/冲突,但在我看来,这里只涉及与 spring 数据相关的依赖项,所有依赖项都通过启动器依赖项进行管理,没有任何特定版本。 -
嗯很尴尬,我们确定这不是代理缓存/响应缓存的任何短类型吗?我的意思是,如果您不重新启动整个应用程序,无论如何它都不会公开 4 个 api 调用?如果您要添加另一个自定义项怎么办?新类是否被放置在不同的 pkg / jar 中?
-
不,它在几个小时(甚至几天)内保持不变。存储库位于模块本身的同一包中(
@EntityScan的已配置基本包的子包)。 -
很可能是一个暂时的依赖,你建议回到引导父 1.5.18,不会产生这个问题?
标签: java spring spring-boot spring-data spring-data-rest