web-dev-qa-db-fra.com

Je reçois l'erreur 404 lorsque j'essaie d'accéder à mon application de démarrage printanier sur Amazon Elastic Bean Stalk

J'ai développé une application spring boot et j'ai mis les entrées suivantes dans src/main/resources/application.properties:

spring.mvc.view.prefix: /
spring.mvc.view.suffix: .jsp
server.port=5000

Maintenant, quand je le lance (mvn clean spring-boot:run) localement, je reçois la sortie Tomcat started on port(s): 5000 (http) et l'application est accessible dans le navigateur sous http: // localhost: 5000/welcome

J'ai créé une instance Java dans Amazon Elastic Bean Stalk, j'ai téléchargé war et j'ai même ouvert le port 5000 dans le groupe de sécurité correspondant sur l'instance EC2:

 enter image description here

mais quand je vais maintenant à http://my-aws-ebs-instance.com/welcome:5000 , je reçois le message suivant:

 enter image description here

Page d'erreur Whitelabel Cette application n'a pas de mappage explicite pour /error, vous voyez donc cela comme une solution de secours.

Jeu. 20 déc. 16:30:33 UTC 2018 Une erreur inattendue s'est produite (type = Non Trouvé, statut = 404). /welcome.jsp

Pourquoi oh pourquoi ça se passe comme ça? Qu'est-ce que j'ai oublié de configurer?

----MODIFIER

comme demandé, voici la classe Java racine:

package com.hellokoding.auth;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApplication.class);
    }

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

Voici également la structure de mon projet avec la page welcome.jsp en surbrillance:

 enter image description here

Lorsque je décompresse le fichier war généré, voici la structure de fichier sur mon disque dur:

 enter image description here

Mon fichier 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>
    <artifactId>auth</artifactId>
    <name>auth</name>
    <description>my descr</description>
    <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <Java.version>1.7</Java.version>
    </properties>

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

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

        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>

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

        <dependency>
            <groupId>org.Apache.Tomcat.embed</groupId>
            <artifactId>Tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

et la classe UserController contient:

...

@Controller
@Scope("session")
public class UserController {

@RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET)
public String welcome(Model model) {

    return "welcome";
}

...    

J'ai ajouté des journaux à l'intérieur de la méthode welcome et je vois qu'elle fonctionne correctement. De plus, dans les fichiers de log, je peux voir l'entrée suivante:

Mapped "{[/ || /welcome],methods=[GET]}" onto public Java.lang.String com.hellokoding.auth.web.UserController.welcome(org.springframework.ui.Model)

donc je ne sais pas pourquoi cette chose ne fonctionne pas. Après avoir essayé pendant 11 heures d'affilée pour que cela fonctionne, je remets en question mes choix de vie et je me demande aussi pourquoi quelqu'un utiliserait un cadre aussi stupide, étant donné que cela ne fonctionne pas.

--- modifier:

J'ai téléchargé un code simplifié sur github https://github.com/nalogowiec/springbootProblem

7
randomuser1

Solution 1:

Si vous voulez un démarrage printanier avec des JSP dans des fichiers jar exécutables

Gardez à l'esprit que nous placerons finalement les modèles JSP sous src/main/resources/META-INF/resources/WEB-INF/jsp/

Remarque: Définissez le préfixe et le suffixe du modèle pour nos fichiers JSP dans application.properties.

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Ensuite, vous pouvez exécuter le fichier jar en utilisant la commande ci-dessous:

Java -jar <your jar name>

 for your project you can below command

   Java -jar  auth-1.3.5.RELEASE.jar

Pour plus de références: https://dzone.com/articles/spring-boot-with-jsps-in-executable-jars-1

Solution 2: 

Limitations JSP

Lorsque vous exécutez une application Spring Boot qui utilise un conteneur de servlet intégré (et est packagée sous la forme d'une archive exécutable), la prise en charge JSP présente certaines limitations.

Avec Jetty et Tomcat, cela devrait fonctionner si vous utilisez des emballages de guerre. Un war exécutable fonctionnera lorsqu’il sera lancé avec Java -jar et pourra également être déployé dans n’importe quel conteneur standard. Les fichiers JSP ne sont pas pris en charge lors de l'utilisation d'un fichier jar exécutable . Undertow ne prend pas en charge les fichiers JSP . La création d'une page personnalisée error.jsp ne remplace pas la vue par défaut pour la gestion des erreurs. Les pages d'erreur personnalisées doivent être utilisées à la place.

J'ai cloné votre projet GitHub capable d'exécuter le projet (si vous suivez les étapes ci-dessous, votre problème sera résolu définitivement) 

Step To run your project :

Step 1 : Create war package of your project

Step 2 : Run your war package using below command 

    Java -jar <your war file name> 

    i.e for your project command should be like :

      Java -jar  auth-1.3.5.RELEASE.war

Step 3 : Hit the URL  http://localhost:5000/

Vous pouvez voir le résultat dans le navigateur.

Plus de références: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

1
Dipak Thoke

Si vous vérifiez les documents Spring Boot, cela indique clairement que vous utilisez une structure de répertoire incorrecte.

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc

Par défaut, Spring Boot sert le contenu statique d'un répertoire appelé/static (ou/public ou/resources ou/META-INF/resources) dans le chemin d'accès aux classes ou à la racine du ServletContext ... N'utilisez pas le fichier src/main/répertoire webapp si votre application est packagée en tant que jar. Bien que ce répertoire soit une norme courante, il ne fonctionne qu'avec les packages de guerre, et la plupart des outils de génération l’ignorent silencieusement si vous générez un fichier jar.

0
galovics