gpt4 book ai didi

Spring Boot - DevTools - RestController 在重建项目时并不总是映射

转载 作者:行者123 更新时间:2023-12-04 11:35:02 25 4
gpt4 key购买 nike

我在 maven 中使用 SpringBoot 1.3.5。

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>

和开发工具
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

我正在使用 Intellij IDEA 2016.2,之前是 2014 年,有同样的问题。

我正在从 Intellij Idea 运行我的 springboot 应用程序,首先启动一切都很好并且可以正常工作,我可以访问我的静态页面并且我的 2 Rest Controllers 工作。
2016-08-18 15:27:58.771  INFO 26626 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@469d0c02: startup date [Thu Aug 18 15:27:57 CEST 2016]; root of context hierarchy
2016-08-18 15:27:58.789 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/authentication/introspect],methods=[GET]}" onto public com.myapp.models.TokenIntrospection com.myapp.resources.AuthenticationResources.introspectToken(java.lang.String)
2016-08-18 15:27:58.790 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration],methods=[GET]}" onto public com.myapp.models.AppConfiguration com.myapp.resources.ConfigurationResources.getConfiguration()
2016-08-18 15:27:58.792 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-08-18 15:27:58.793 INFO 26626 --- [ restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)

因为简单的“制作项目”对静态重新加载不起作用,我使用“重建项目”,有时,当应用程序重新启动时,我没有映射我的 Controller ,有时一个丢失,有时两个都丢失。

我对此一无所知:(

编辑

@Morfic 解决方案不起作用,所以我使用 Intellij 本地服务器来提供静态内容和 gulp-livereload 而不是 spring-dev-tools。

IJ local server

当我处于开发模式时,我只需要在 JS 中管理 REST 调用,因为 REST 资源在 localhost:8080 上,但我在 localhost:63342 上的静态,并在我的 springboot 中启用 CORS(在属性文件中带有一个标志以启用或不启用 CORS )。

@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {

@Value("${cors.enabled}")
private boolean corsEnabled;

@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
if(corsEnabled) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "PUT", "POST", "DELETE", "OPTIONS")
.allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization")
.allowCredentials(true)
.maxAge(3600L);
}
}
}

所以问题仍然悬而未决,以寻求有效的解决方案。

最佳答案

我只是设法通过一个简单的 hello-world 服务并使用 Rebuild project 来重现它。几次,因为它只是偶尔复制一次。我的预感是,在 IJ 有机会完全清理和重建之前,开发工具会发现发生了变化。可能一旦资源发布并且在从我看到的输出目录中编译类之前,开发工具就会开始重新加载尚未存在的类......

按照这个假设,我查看了日志和类时间戳,在开发工具开始重新加载上下文的时间和我的类写入磁盘的时间之间大约有 1 秒的间隔。显然我的 @PostConstruct 都没有出现日志并且 spring 的自动配置找不到我的类...

作为解决方法,您可以使用 trigger-file .按照链接中的建议将其作为全局配置添加到您的主目录中,或者添加到您的 application.properties 中。文件。此外,由于对此文件的任何更改(创建、删除、修改)都会触发重新启动,并且 Rebuild project清理输出目录,你必须定义一个额外的路径来查找这个文件。因此,假设我们有一个常规的 IJ spring boot 运行配置,在 application.properties 中有以下 2 个配置。 :

# name of the file to trigger a restart
spring.devtools.restart.trigger-file=restarttrigger

# where else to look for it. Also . evaluates to the app's base dir
spring.devtools.restart.additional-paths=.

...一旦您看到 IJ 完成构建过程,请转到应用程序根目录并添加或删除您的触发器文件,具体取决于它是否已经存在,这将导致重新启动。我已经测试了几次,到目前为止没有尝试失败。下面是手动重启过程的简短视频演示:

IJ - boot dev tools manual restart

有几种方法可以自动执行此过程。除了在 IJ 中定义一个人工制品并使用后处理 ant 任务生成文件之外,您还可以使用 maven(您已经在使用)来生成这样的文件,但缺点是您必须使用 maven compile而不是 Rebuild project因为在进行重建时 IJ 不会调用 maven(或者我还没有找到如何做到这一点)。请在下面找到一个简单的配置 based on the fact that :

(Note: In Maven 2.0.5 and above, multiple goals bound to a phase are executed in the same order as they are declared in the POM, however multiple instances of the same plugin are not supported. Multiple instances of the same plugin are grouped to execute together and ordered in Maven 2.0.11 and above).



因此, the compiler plugin is by default bound to the compile phase ,所以我们添加一个小任务来生成 trigger-file使用 application.properties文件(或其他任何东西)

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!-- first, compile all we need -->
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
</plugin>
<plugin>
<!-- then, generate the trigger-file so dev-tools will restart -->
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<tasks>
<copy file="${project.basedir}/src/main/resources/application.properties"
toFile="${project.basedir}/restarttrigger" overwrite="true" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

进一步更新:

看源码 FileSystemWatcher.scan() ,有一个 do-while循环可以解释为:虽然自上次检查以来文件系统上仍在进行更改,但等待(可配置的)时间并再次验证

private void scan() throws InterruptedException {
Thread.sleep(this.pollInterval - this.quietPeriod);
Map<File, FolderSnapshot> previous;
Map<File, FolderSnapshot> current = this.folders;
do {
previous = current;
current = getCurrentSnapshots();
Thread.sleep(this.quietPeriod);
}
while (isDifferent(previous, current));
if (isDifferent(this.folders, current)) {
updateSnapshots(current.values());
}
}

根据 documentation , quietPeriod可通过 spring.devtools.restart.quiet-period 进行配置属性,但也根据上面提到的来源,它必须是小于 pollInterval 的值可通过 spring.devtools.restart.poll-interval 配置.因此,玩弄这些设置,我得到了一个不错的结果:
# Amount of time (in milliseconds) to wait between polling for classpath changes.
spring.devtools.restart.poll-interval=3000

# Amount of quiet time (in milliseconds) required without any classpath changes before a restart is triggered.
spring.devtools.restart.quiet-period=2999

最后,您应该能够将这些值调整为最适合您的值。

尽管如此,如果您正在修改的源是静态资源,例如 FE GUI 页面,并且根据您的要求,也许最好使用从它们的位置为它们提供服务的工具,例如节点或类似的简单 http 服务器...

关于Spring Boot - DevTools - RestController 在重建项目时并不总是映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39019938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com