RestController在SpringBoot中工作正常,但在Tomcat上抛出404

时间:2018-09-25 21:54:11

标签: spring-boot tomcat http-status-code-404 spring-restcontroller

我有一个简单的RestController应用程序-

@RestController
public class GreetingController {

    private static final Logger logger = LogManager.getLogger(GreetingController.class);

    @RequestMapping("/greeting")
    public ResponseEntity<GreetingResponse> greeting(@RequestParam(value = "name", defaultValue = "World") String name) throws ServiceException, Exception {
        logger.info("Received Request. Name: " + name);

它在SpringBoot(http://localhost:8080/greeting)上运行良好,但是当我创建一个WAR并将其部署到Tomcat(9.0.2)上时,它将抛出404。

应用程序部署良好,我可以在应用程序中访问静态HTML页面,因此上下文路径正确。

我可能会缺少什么?

这是我的毕业任务-

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('com.jayway.jsonpath:json-path')
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0'    
}

war {

    archiveName = "ROOT.war"
    manifest {attributes "Implementation-Version": "${version}"}
}

如果有人好奇,我会压缩整个应用程序here

2 个答案:

答案 0 :(得分:1)

发现了问题。我的应用程序必须扩展SpringBootServletInitializer

@SpringBootApplication
public class Application  extends SpringBootServletInitializer {

答案 1 :(得分:0)

您的回答是正确的,我只是想补充一下,如果您有需要为应用程序创建war文件并将其部署在Tomcat或IBM Liberty等外部应用程序服务器上的要求,那就是最好在将其安装在外部App服务器中时禁用内置的tomcat启动器。这可以通过使用POM文件中的个人档案标签并使用排除标签来指定您不需要“ spring-boot-starter-tomcat”来完成。

我们的POM看起来像这样

<groupId>com.anz.tpp</groupId>
<artifactId>example-project</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>Example Project</name>

<!-- Versions -->
<properties>
    <apache.camel.version>X.X.X</apache.camel.version>
    <junit.version>X.X</junit.version>
</properties>


<!-- Spring Boot Parent -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
    <relativePath />
</parent>

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <activatedProperties>dev</activatedProperties>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

        </dependencies>

        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>false</filtering>
                </resource>
            </resources>

            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <skip>true</skip>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

            </plugins>
        </build>
    </profile>

    <profile>
        <id>local</id>
        <properties>
            <activatedProperties>local</activatedProperties>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
        .......

    </profile>
</profiles>

不确定这是否真的会给您带来麻烦,但是最好在两个配置文件下进行操作,在这些配置文件中,您可以使用一个配置文件通过intelliJ或Eclipse等IDE通过其他方式运行项目,也可以使用dev配置文件通过指定“ mvn clean install -U -P dev”来构建软件包,以将war文件部署在外部应用服务器(例如tomcat或IBM Liberty)中。

如果您已经弄清楚了,我深表歉意,只是这在我的春季启动项目的开始阶段对我有帮助。希望这会有所帮助!