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+ 应该可以解决这个特定问题。
我有解决此问题的方法,但我想 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+ 应该可以解决这个特定问题。