Я получаю сообщение об ошибке 404 при попытке получить доступ к моему весеннему загрузочному приложению на Amazon Elastic Bean Stalk - PullRequest
0 голосов
/ 20 декабря 2018

Я разработал приложение spring boot и поместил следующие записи в src/main/resources/application.properties:

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

Теперь, когда я запускаю его (mvn clean spring-boot:run) локально, я получаю выводTomcat started on port(s): 5000 (http) и приложение доступно в браузере под http://localhost:5000/welcome.

Я создал экземпляр Java в Amazon Elastic Bean Stalk, я загрузил war, я даже открыл порт 5000 в соответствующей группе безопасности на экземпляре EC2:

enter image description here

, но когда я сейчас перехожу на http://my -aws-ebs-instance.com / welcome: 5000 , я получаю следующее сообщение:

enter image description here

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант.

Чт 20 декабря 16:30:33 UTC 2018 Произошла непредвиденная ошибка (тип = Не найдено, статус = 404)./welcome.jsp

Почему так происходит?Что я забыл настроить?

---- РЕДАКТИРОВАТЬ

в соответствии с запросом, вот корневой класс java:

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);
    }
}

Вот также структура моего проектас выделенной страницей welcome.jsp:

enter image description here

Когда я распаковываю сгенерированный файл war, это структура файла на моем жестком диске:

enter image description here

Мой 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>

, а класс UserController содержит:

...

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

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

    return "welcome";
}

...    

Я добавил несколько журналов в метод welcome и вижу, что он работает правильно.Кроме того, в файлах журнала я вижу следующую запись:

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

, поэтому я понятия не имею, почему эта вещь не работает.После 11 часов попыток заставить его работать, я подвергаю сомнению свой жизненный выбор, а также задаюсь вопросом, почему кто-нибудь когда-либо использовал бы такой глупый фреймворк, поскольку он не работает ootb.

---edit:

Я загрузил упрощенный код в github https://github.com/nalogowiec/springbootProblem

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Если вы проверяете документы Spring Boot, ясно, что вы используете неверную структуру каталогов.

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

По умолчанию Spring Boot передает статическое содержимое изкаталог / static (или / public или / resources или / META-INF / resources) в пути к классам или из корня ServletContext ... Не используйте каталог src / main / webapp, если ваше приложение упаковано как jar,Хотя этот каталог является общепринятым стандартом, он работает только с военным пакетом, и большинство инструментов сборки игнорирует его, если вы генерируете jar.

0 голосов
/ 25 декабря 2018

Решение 1:

Если вы хотите Spring Boot с JSP в исполняемых банках

Имейте в виду, что в конечном итоге мы разместим JSPшаблоны в src/main/resources/META-INF/resources/WEB-INF/jsp/

Примечание: определяет префикс и суффикс шаблона для наших файлов JSP в application.properties

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

Затем вы можете запустить файл JAR, используя нижеКоманда:

java -jar <your jar name>

 for your project you can below command

   java -jar  auth-1.3.5.RELEASE.jar

Для получения дополнительной информации: https://dzone.com/articles/spring-boot-with-jsps-in-executable-jars-1

Решение 2:

Ограничения JSP

При запуске приложения Spring Boot, которое использует встроенный контейнер сервлета (и упакован в виде исполняемого архива), существуют некоторые ограничения в поддержке JSP.

В случае Jetty и Tomcat это должно работать, если выиспользовать военную упаковку.Исполняемая война будет работать при запуске с java -jar, а также будет развернута в любом стандартном контейнере.JSP не поддерживаются при использовании исполняемого файла jar.Undertow не поддерживает JSP.Создание пользовательской страницы error.jsp не переопределяет представление по умолчанию для обработки ошибок.Вместо этого следует использовать пользовательские страницы ошибок.

Я клонировал ваш проект GitHub, способный запустить проект (если вы выполните следующие шаги, ваша проблема обязательно будет решена)

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/

Вы можете увидетьрезультат в браузере.

Дополнительная информация: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

0 голосов
/ 20 декабря 2018

Поскольку у вас есть приложение на порту 5000, оно доступно через этот порт, а не по умолчанию http-порт 80.

Либо получите к нему доступ с помощью

http://my-aws-ebs-instance.com:5000/welcome

, либо создайте руну переадресации портов в AWSпоэтому трафик, идущий на порт 80, будет перенесен на порт сервера приложений 5000.

...