当前位置: 首页 > 知识库问答 >
问题:

重建项目时,Springboot-DevTools-RestController不总是映射

闾丘书
2023-03-14

我在maven中使用SpringBoot 1.3.5。

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

和devtools

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

我正在使用智能IDEA 2016.2,以前是2014年,有同样的问题。

我正在从Intellij Idea运行我的Spring靴应用程序,首先启动所有内容都加载得很好并且工作正常,我可以访问我的静态页面和我的2 Rest控制器工作。

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)

因为简单的“Make Project”对于静态重新加载不起作用,我使用“Rebuild Project”,有时,当应用程序重新启动时,我没有映射我的控制器,有时缺少一个,有时两个都缺少。

我对此一无所知:(

编辑

@Morfic解决方案不起作用,所以我使用Intellij本地服务器来提供静态内容和吞噬负担,而不是Spring开发工具。

当我处于开发模式时,我只需要在JS中管理REST调用,因为REST资源在localhost:8080但我的静态在localhost:63342,并在我的springboot中启用CORS(属性文件中带有启用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);
        }
    }
}

因此,问题仍在等待有效的解决方案。

共有2个答案

华峰
2023-03-14

莫菲的这部分回答对我来说很有效:

# 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
金和雅
2023-03-14

我只是用一个简单的hello world服务复制了它,并多次使用<code>重建项目

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

作为一种变通方法,您可以使用一个触发文件。按照链接中的建议,将它作为全局配置添加到您的home-dir中,或者添加到您的< code > application . properties 文件中。此外,由于对该文件的任何更改(创建、删除、修改)都会触发重新启动,并且< code>Rebuild project会清理输出目录,因此您必须定义一个额外的路径来查找该文件。因此,假设我们有一个常规的IJ spring启动运行配置,在< code > 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 中定义一个工件并使用后处理 ant 任务来生成文件之外,您还可以使用 maven(您已经在使用)来生成这样的文件,但缺点是您必须使用 maven 编译而不是 Rebuild 项目,因为 IJ 在进行重建时不会调用 maven(或者我还没有找到如何做到这一点)。请在下面找到一个简单的配置,基于以下事实:

(注意:在Maven 2.0.5及更高版本中,绑定到一个阶段的多个目标以与POM中声明的相同顺序执行,但是不支持同一插件的多个实例。同一插件的多个实例被分组在一起执行,并在Maven 2.0.11及更高版本中排序)。

因此,编译器插件默认绑定到< code>compile阶段,所以我们添加一个小任务来使用< code > 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>

进一步更新:

查看文件系统观察者.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());
    }
}

根据文档,< code>quietPeriod可通过< code > spring . dev tools . restart . quiet-period 属性进行配置,但根据上述来源,它必须是小于可通过< code > spring . dev tools . restart . poll-interval 配置的< code>pollInterval的值。因此,通过调整设置,我得到了一个不错的结果:

# 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页面,并且取决于您的需求,可能最好使用从其位置提供服务的工具,如node或类似的简单http服务器。。。

 类似资料:
  • 错误:任务“app:transformClassesWithDexForDebug”的执行失败。

  • 以下示例适用于请求,但不适用于。我的目标是让spring自动从input(请求正文和查询参数)解析: 作品: POSTlocalhost:8080/datetime 但GET也不适用: 获取localhost:8080/datetime?日期=2022-02-02 结果: org.springframework.web.bind.support.WebExchangeBindException:方

  • 航班类别:package com.rahul.flightreservation.entities; 表说明:ID航班号运营航空公司出发城市到达城市日期出发估计日期出发时间 错误:Hibernate:from Fligher where departurecity=?和到达=?和DateofDeparture=?2020-06-28 20:32:13.138警告5744---[nio-8083-e

  • 我有一个大规模的Spring Boot应用程序,它由几个项目组成,项目之间有依赖关系。其中两个项目是“Web应用程序”,可以以通常的方式运行。两者都包括Spring的devtools用于重新启动/实时重新加载功能。除了devtools特性之外,所有的构建/运行都很好。 我们遇到的问题是,一旦其中一个应用程序启动,整个应用程序目录就成为重新加载触发器的一部分--资源、模板、CSS、gradle.bu

  • 我有一个GitHub项目(我正在使用它(我没有创建它)),名为OpenRefine,我想将其封装在Docker映像中,这样其他人就可以从“Docker Hub”中提取该Docker映像,并将OpenRefine安装在他们的基本交互Docker实体上,即。形象 然后我想将它上传到一个我可以与其他人共享的存储库。 如果它有一个名字,而不是一个疯狂的散列值,那就好了。 是不是我用命令创建了一个“dock