web-dev-qa-db-fra.com

Botte de printemps REST Le contrôleur renvoie 404 lorsqu'il est déployé sur un serveur Tomcat 9 externe

J'ai une application Web Spring Boot Rest qui fonctionne parfaitement sur le serveur intégré. Cependant, après avoir suivi les étapes mentionnées dans son blog https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file , I J'ai reçu un message d'erreur 404 lors de l'envoi d'une requête à une ressource sur le serveur. J'ai utilisé Java 1.8.0_212 localement, Java 1.8.0_131 et déployé mon application sur Tomcat 9 sur le serveur. Une chose qui me laisse perplexe est que les référentiels qui étend CrudRepository sont accessibles. Ci-dessous, le point d'entrée de mon application.

@SpringBootApplication
@ComponentScan(basePackages = "com.dbe.ref")
public class RefmsApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(RefmsApplication.class);
    }

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

et aussi mon 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.dbe.ref</groupId>
    <artifactId>refms</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>refms</name>
    <description>project for Rural electrification fund</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>LATEST</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>
        <start-class>com.RefmsApplication</start-class>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <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-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.Oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>angularjs</artifactId>
            <version>1.4.10</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.4</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>font-awesome</artifactId>
            <version>4.7.0</version>
        </dependency>
        <dependency>
            <groupId>eu.michael-simons</groupId>
            <artifactId>wro4j-spring-boot-starter</artifactId>
            <version>0.3.4</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.Apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.dynamicreports</groupId>
            <artifactId>dynamicreports-core</artifactId>
            <version>5.0.0</version>
        </dependency>

    </dependencies>

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

</project>

Voici une partie du journal:

2017-09-19 10:38:20.564  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'errorPageFilter' to: [/*]
2017-09-19 10:38:20.565  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-09-19 10:38:20.566  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-09-19 10:38:20.568  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-09-19 10:38:20.568  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-09-19 10:38:20.571  INFO 6660 --- [           main] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
2017-09-19 10:38:20.571  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'configurableWroFilter' to urls: [/wro4j/*]
2017-09-19 10:38:20.572  INFO 6660 --- [           main] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServletRegistration' to [/refms/*]
2017-09-19 10:38:20.573  INFO 6660 --- [           main] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
6
MikiEthiopia

Il y a une petite différence lorsque vous déployez une application sur un serveur intégré et un serveur externe par défaut.

Avec le serveur intégré, vous pouvez accéder à votre application en utilisant: 

http://localhost:<port>/<resourceName>

Alors que si vous déployez war dans un autre conteneur, vous devez ajouter un nom d’application avec une version telle que:

http://localhost:<port>/<applicationNameWithVersion>/<resourceName>

Par exemple, si vous déployez cet exemple , l'URL du serveur intégré est la suivante:

http://localhost:8080/greeting

Et l'URL pour une application déployée en externe si:

http://localhost:8999/gs-rest-service-0.1.0/greeting

Remarque: cette adresse URL provient de mon serveur d'applications. Des modifications peuvent donc être apportées au vôtre.

Commentez si vous avez besoin d'aide.

6
Sunil Kanjar

Vérifiez si le 

<build>
     <finalName>refms</finalName>
         ...
</build>

dans le pom.xml correspond à la

server.contextPath=/refms

dans le fichier application.properties et cochez la case

<Context path="/refms"/>

dans le context.xml. Peut-être que votre contexte racine dans Tomcat Après le déploiement était différent.

De plus, changez cette dépendance

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

par ça

<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>

pour Tomcat externe

2
Ednilson Campos

Lorsque vous déployez votre application dans Tomcat, l'URL dépend du chemin de contexte sous lequel votre application est déployée. La plupart du temps, il s’agit d’une correspondance exacte avec le nom du fichier war que vous avez placé dans le répertoire "webapps" de Tomcat. Vous pouvez voir le nom en consultant votre répertoire "webapps". Votre fichier war est probablement aussi également dépensé dans un répertoire.

Puisque vous avez mis un finalName dans votre section de construction maven, votre fichier war doit s'appeler: refms.war, votre application sera donc exécutée sous:

http: // hôte: port/refms/

Mon hypothèse est que vous avez notrenommé le fichier war avant de le copier dans Tomcat. ROOT.war, de sorte que votre application sera nots'exécutera sur:

http: // Host: port/

Si vous le faites, votre application s'exécutera de la même manière que l'instance intégrée de Tomcat. sur le contexte racine.

Dans votre fichier journal, je peux voir que votre noeud final d’authentification est mappé sur / refms /

Mapping servlet: 'dispatcherServletRegistration' to [/refms/*]

Ceci est relatif à la racine de contexte de votre application. Ainsi, au cas où vous ne renommeriez pas votre fichier war, le point de terminaison d’authentification sur lequel vous recevez un message 404 sera probablement situé sous:

http://localhost:8080/refms/refms/api/account/authenticate
0
Jeroen

dans vos commentaires, vous avez indiqué/authentifier que vous donnez 404, car vous avez défini l'URL du processus de connexion sur «authentifier». C’est l’URL à laquelle le formulaire de connexion est envoyé. Si non spécifié, il utilise par défaut /login.Spring Le cadre de sécurité intercepte cette URL et obtient le paramètre login et password.

0
prabhat

Assurez-vous d'avoir ajouté le chemin de contexte à votre application de démarrage Spring. En règle générale, il se trouve dans le fichier application.properties dans src\main\resources. Dans ce fichier de propriétés, ajoutez les propriétés:

server.contextPath=/refms

Vous devriez pouvoir accéder à votre application en utilisant le lien ci-dessous localhost:8080/refms/api/account/authenticate ou localhost:8080/refms-xxxx/api/account/authenticate (où xxxx est votre version d'artefact)

0
utpal416