繁体   English   中英

我在 Amazon Elastic Bean Stalk 上尝试访问我的 spring boot 应用程序时收到错误 404

[英]I'm getting error 404 while trying to access my spring boot app on Amazon Elastic Bean Stalk

我开发了一个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下的浏览器中访问该应用程序/欢迎

我在 Amazon Elastic Bean Stalk 中创建了一个Java实例,我上传了war ,我什至在 EC2 实例上的相应安全组中打开了端口 5000:

在此处输入图像描述

但是当我现在访问http://my-aws-ebs-instance.com/welcome:5000时,我收到以下消息:

在此处输入图像描述

Whitelabel Error Page 此应用程序没有明确的 /error 映射,因此您将其视为后备。

2018 年 12 月 20 日星期四 16:30:33 UTC 出现意外错误(类型 = 未找到,状态 = 404)。 /欢迎.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页面:

在此处输入图像描述

当我解压缩生成的war文件时,这是我硬盘上的文件结构:

在此处输入图像描述

我的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 上不起作用。

- - 编辑:

我已经上传了一个简化的代码到 github https://github.com/nalogowiec/springbootProblem

解决方案 1:

如果你想要在可执行 Jar 中使用 JSP 的 Spring Boot

请记住,我们最终会将 JSP 模板放在src/main/resources/META-INF/resources/WEB-INF/jsp/

注意:在 application.properties 中为我们的 JSP 文件定义模板前缀和后缀

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

当运行使用嵌入式 servlet 容器(并打包为可执行存档)的 Spring Boot 应用程序时,JSP 支持存在一些限制。

使用 Jetty 和 Tomcat,如果您使用 war 包装,它应该可以工作。 当使用 java -jar 启动时,可执行的 war 将起作用,并且还可以部署到任何标准容器。 使用可执行 jar 时不支持 JSP。 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

很好的解释@dipak-thoke。

只是添加如果有人自动化部署过程(在我的例子中,它是通过 CodeBuild 和 CodeDeploy),你可以创建Procfile并部署战争。 我已将 Procfile 添加到项目的根目录中并将其添加为工件。 希望这有助于寻找相同用例的人:)

过程文件:

web: java -jar <your_war_file>.war 

这就是我的 CodeBuild 构建规范的样子:

version: 0.2

phases:

  build:
    commands:
      # - command
      - ./gradlew bootWar
  post_build:
    commands:
      # - command
      - echo Build must be completed
      - mv build/libs/*.war <WarFileName>.war

artifacts:
  files:
    # - location
     - <WarFileName>.war
     - Procfile
  #name: $(date +%Y-%m-%d)
  #discard-paths: yes
  #base-directory: location
#cache:
  #paths:
    # - paths

如果您查看 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。 虽然这个目录是一个通用标准,但它只适用于 war 打包,如果你生成一个 jar,它会被大多数构建工具默默地忽略。

由于您的应用程序位于端口 5000 上,因此可以在该端口上访问它,而不是默认的 http 端口 80。

要么访问它

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

或在 AWS 中创建端口转发符文,以便到端口 80 的流量将被推送到应用程序服务器的端口 5000。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM