Не удается получить RESTful-сервис с приложением Spring Boot - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь запустить простое приложение Spring Boot на Wildfly 13.0.0, но я всегда получаю ошибку 404 при попытке получить любой URL REST.

Вот мой класс приложения:

package com.application.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
public class ExampleApp extends SpringBootServletInitializer{

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }

    private static Class<ExampleApp> applicationClass = ExampleApp.class;


}

@RestController
class HelloController {

    @RequestMapping("/hello/{name}")
    String hello(@PathVariable String name) {

        return "Hi " + name + " !";

    }
}

А вот мой pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.application</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>example</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>application-example</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

.war правильно развернут, и я могу открыть созданную мною HTML-страницу индекса, если перейти на localhost: 8080 / application-example / index.html , но если я попытаюсь localhost: 8080 / application-example / hello или localhost: 8080 / application-example / hello / myName или даже оригинальное имя с моментальным снимком 0.0.1 в конце я всегда получаю 404.

Конечно, это также происходит с классами RestController внутри внутренних пакетов, но в приведенном выше примере мы находимся в одном пакете, поэтому я не думаю, что это проблема видимости / сканирования.

Вот мои требования application.properties:

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

spring.datasource.url=jdbc:mysql://localhost:3306/example
spring.datasource.username=root@localhost
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver

server.servlet.contextPath=/application-example

Я что-то упустил? Если вам нужна дополнительная информация, пожалуйста, спросите.

1 Ответ

0 голосов
/ 04 июля 2018

Как описано в Spring Docs , вам не хватает ниже:

Популярной темой является то, что многие люди все еще хотят создавать файлы WAR для развертывания внутри контейнеров. Оба эти плагина также поддерживают это. По сути, вы должны перенастроить свой проект, чтобы создать WAR-файл и объявить зависимости встроенного контейнера как «предоставленные». Это гарантирует, что соответствующие зависимости встроенного контейнера не будут включены в файл WAR.

Чтобы создать военный файл, который является одновременно исполняемым и развертываемым во внешнем контейнере, необходимо пометить зависимости встроенного контейнера как «предоставленные». ”, Как показано в следующем примере:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

ПРИМЕЧАНИЕ: Вам не нужны исключения.

UPDATE Выполните этот рабочий проект на github для spring-boot with wildfly, чтобы сравнить отсутствующую конфигурацию.

...