404 在控制器端点 Spring 而在客户服务器上 运行

404 on Controller Endpoint Spring while running on customer server

我在 Gradle spring 项目中一直得到 404,而 运行 在 tomcat 8.5 上。 我从 https://start.spring.io 创建了一个简单的项目并将其导入到 spring 工具套件。

当我 运行 它作为 spring 启动应用程序时,我能够到达端点 http://localhost:8080/healthCheck 但是当我将它添加到我创建的服务器时 (tomcat 8.5),我在同一端点上收到 404 错误。

这是我的简单控制器:

@RestController
public class HealthCheckController {

    @GetMapping("/healthCheck")
    public String healthCheck() {
        return "API is accessible";
    }
}

这是我的 build.gradle:

plugins {
    id 'org.springframework.boot' version '2.5.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-tomcat:2.5.4'
}

test {
    useJUnitPlatform()
}

这是我的主要 class:

@SpringBootApplication
public class PracticeApplication extends SpringBootServletInitializer  {

    public static void main(String[] args) {
        SpringApplication.run(PracticeApplication.class, args);
    }
    
    @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(PracticeApplication.class);
      }

}

我已将服务器位置更改为使用 Tomcat 安装,因此我可以点击 http://localhost:8080 并显示 tomcat 主页。

这是我的目录结构供参考:

我是 gradle 和 spring 的新手,如果我做错了愚蠢的事情,我深表歉意。

请按如下方式更改您的代码:

@SpringBootApplication
public class PracticeApplication extends SpringBootServletInitializer  {

    public static void main(String[] args) {
        SpringApplication.run(PracticeApplication.class, args);
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(PracticeApplication.class, HealthCheckController.class);
    }
}

看来您需要列出应用程序中的所有配置类和组件。

不过,我想在你的情况下不需要重写 configure() 方法,所以我也会尝试:

@SpringBootApplication
public class PracticeApplication extends SpringBootServletInitializer  {

    public static void main(String[] args) {
        SpringApplication.run(PracticeApplication.class, args);
    }
}

所以 Apache Tomcat 不接受 jar 文件,运行 spring 在外部 tomcat 服务器(非嵌入式服务器)上启动应用程序,WAR 需要创建文件。

我将 war 添加到我的 build.gradle 并给它起了一个别名

plugins {
    id 'org.springframework.boot' version '2.5.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'war'
}

war {
    archiveName = 'practice.war'
}

添加以上内容后,我刷新了 Gradle 项目并重新启动了服务器,然后我点击了以下端点: http://localhost:8080/practice/healthCheck 这与我们在嵌入式服务器上访问上述端点的方式不同,后者是: http://localhost:8080/healthCheck

运行 的另一种方法是转到 build/libs/ 并将 war 复制到 ROOT 目录,然后从 [=15] 运行 startup.bat =]