RepositoryRestResource 资源在 运行 一段时间后开始返回 404 错误

RepositoryRestResource resources started returning 404 errors after running for a while

我有解决此问题的方法,但我想 post 以防其他人 运行 遇到此问题。

我们有一个 Spring 启动 Web 应用程序,它被打包为 war 文件并部署到 Tomcat。它有几个用 @RepositoryRestResource 注释的 PagingAndSortingRepository 类 服务于休息请求,还有一些其他 类 用 @RestController 注释。 RestController 类 确实调用了存储库 类。

2.2.5.RELEASE 版本的 spring-boot 一切正常。我们运行升级到2.2后遇到了问题。6.RELEASE。一切都很好(这意味着两种类型的休息资源都可以访问)但是在 运行 大约 10-15 分钟后,通过 RepositoryRestResource 访问的所有内容开始返回 404 错误。任何日志中都没有错误消息,它们在之前工作正常时才开始返回 404 错误。 RestControllers 一直保持正常工作。恢复到 2.2 后。5.RELEASE,我们没有更多问题。

由于我们使用的是dependencyManagement,所以我认为这不是版本不匹配的问题。 pom.xml 文件中的 spring 个项目有 None 个版本。这是 pom 中的内容:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

升级到 spring-boot 2.2.6 后,我重现了完全相同的问题:PagingAndSortingRepository 类 annotated with @RepositoryRestResource started randomly to return 404 errors...回滚到版本 2.2.5 解决了问题!

这是我们的问题:事实证明我们有多个 context.xml 文件和多个 application.properties 文件,尽管罪魁祸首似乎是 context.xml 文件。有些东西(Netbeans?)不断生成 src/main/webapp/META-INF/context.xml 文件,但在生产中我们使用外部文件,而不是与 war 文件捆绑在一起的文件。无论如何,发生的事情是在 src 中生成的 context.xml 文件与 war 文件捆绑在一起,并且它的路径与生产上下文文件不同。我不知道为什么,但是当使用 2.2.5 版本时它似乎忽略了那个伪造的捆绑 context.xml 文件,而对于 2.2.6 它变得困惑并开始返回 "not found" 错误。从 war 文件中删除无关的 context.xml 文件使其正常工作。

这是生成的(伪造的)context.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Context path=""/>

这是位于 conf/Catalina/localhost 下的工作 app.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/tdapp" docBase="${catalina.base}/warfiles/tdapp.war">
    <Environment name="spring.config.location" value="file:/usr/share/tdapp/application.properties" type="java.lang.String"/>
</Context>

这是 2.2.6 的一个已知问题。 具体来说: https://jira.spring.io/browse/DATAREST-1502 几个小时后产生 404 错误的副作用(被其他人观察并报告为 https://jira.spring.io/browse/DATAREST-1518

简而言之,升级到 2.2.7+ 应该可以解决这个特定问题。