RestController отлично работает в SpringBoot, но выдает 404 на Tomcat - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть простое приложение 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), он выбрасываетa 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}"}
}

У меня есть почтовый индекс всего моего приложения здесь , если кому-то интересно.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Ваш ответ правильный, я просто хотел добавить к нему, что если у вас есть требование, в котором вам нужно создать файл war для вашего приложения и развернуть его на внешнем сервере приложений, таком как Tomcat или IBM Liberty, этоЛучше всего отключить встроенный стартер Tomcat при развертывании его на внешних серверах приложений.Это можно сделать с помощью тега profile в вашем файле 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>

Не уверен, что это действительно проблема с вашей стороны, но лучше работать в двух профилях, где вы используете один профиль для запуска проекта через IDE, например, intelliJ или Eclipse, и другим способом, вы можете использовать профиль devчтобы собрать свой пакет, указав "mvn clean install -U -P dev", чтобы развернуть файл war на внешнем сервере приложений, таком как tomcat или IBM Liberty.

Мои извинения, если вы уже поняли это, простопомог мне на начальных этапах моего весенне-загрузочного проекта.Надеюсь, это поможет!

0 голосов
/ 26 сентября 2018

Нашел проблему.Моему приложению пришлось расширить SpringBootServletInitializer

@SpringBootApplication
public class Application  extends SpringBootServletInitializer {
...