当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:带有404状态代码的Whitelabel错误页

司徒俊健
2023-03-14

我开发了带有jar包装的小型spring boot应用程序。应用程序用例是,用户将登录到应用程序,它将显示欢迎页面。下面是我的代码。

主类

package com.ibm.heathcare;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages= {"com.ibm.heathcare.*"})
public class HeathcareappApplication {

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

}

登录控制器类

package com.ibm.heathcare.controller;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ibm.heathcare.modal.Login;
import com.ibm.heathcare.modal.User;
import com.ibm.heathcare.service.AuthService;

@Controller
@SessionAttributes({"userName","uid"})
public class LoginController {
    
    @Autowired
    AuthService authService;
    
    @RequestMapping("/login")
    public String showLoginPage(ModelMap model){
        //model.addAttribute("login", new Login());
        return "login";
    }
    
    
      @RequestMapping("/logout") 
      public String showLogoutPage(ModelMap model){
      model.put("message", "Successfully Log out...");
      return "redirect:/login"; 
      
      }
      @RequestMapping("/welcome")
      public String showWelcomePage(ModelMap model) {
          return "welcome";
      }
     
    
    
    @RequestMapping(value="/login" ,method=RequestMethod.POST)
    public String showwelcomePage(@RequestParam String uid, @RequestParam String pwd,ModelMap model){
        Optional<User> optUser=authService.getAuthenticate(uid, pwd);
        if(optUser.isPresent()) {
            User user=optUser.get();
            model.put("userName", user.getUserName() );
            model.put("uid", user.getUserId());
            return "welcome";
        }else {
            model.addAttribute("login", new Login("",""));
            model.addAttribute("errorMessage",new String("Invalid Credential"));
            
            return "login";
        }
        
    }

}

登录。jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form method="post">
            User ID :<input type="text" name="uid"/><p>
            Password:<input type="password" name="pwd"/><br>
            <input type="submit" value="Login" />
    </form>

</body>
</html>

welcome.jsp

<%@ include file="common/header.jspf" %>
<%@ include file="common/navigation.jspf" %>
<div class="jumbotron text-center" >
    <h1>Welcome<h1><p>
    <h2> ${userName} </h2>
</div>
<%@ include file="common/footer.jspf" %>

application.properties

#Server Configuration
server.port = 8282

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

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ibm</groupId>
    <artifactId>heathcare</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>heathcareapp</name>
    <description>Health Care Management Application</description>

    <properties>
        <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.6</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap-datepicker</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

现在,当我通过eclipse执行这个应用程序时,它工作得很好。我使用在目标文件夹中创建的maven工具构建了一个jar应用程序。我已经使用命令行从目标文件夹执行了应用程序jar。它工作得很好。但当我将同一个jar复制到机器上的另一个文件夹并尝试使用java-jar应用程序执行时。jar命令并点击urlhttp://localhost:8282/login在浏览器中,它为我提供了状态代码为404的白标签错误页面。我不确定这个申请有什么问题。我在网上搜索了很多东西,一些专家建议在主类中显式地使用basepackage信息编写@ComponentScan。我也这么做了,但对我来说不起作用。在控制台中,我得到下面的日志。

2020-07-10 10:38:52.605  INFO 11788 --- [         task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-07-10 10:38:53.888  INFO 11788 --- [           main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
2020-07-10 10:38:53.918  INFO 11788 --- [           main] c.ibm.heathcare.HeathcareappApplication  : Started HeathcareappApplication in 24.424 seconds (JVM running for 25.755)
2020-07-10 10:39:18.728  INFO 11788 --- [nio-8282-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-07-10 10:39:18.729  INFO 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-07-10 10:39:18.730 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : Detected StandardServletMultipartResolver
2020-07-10 10:39:18.783 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2020-07-10 10:39:18.784  INFO 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 54 ms
2020-07-10 10:39:18.901 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : GET "/login", parameters={}
2020-07-10 10:39:18.916 DEBUG 11788 --- [nio-8282-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.ibm.heathcare.controller.LoginController#showLoginPage(ModelMap)
2020-07-10 10:39:19.022 DEBUG 11788 --- [nio-8282-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, image/webp, application/xml;q=0.9, */*;q=0.8]
2020-07-10 10:39:19.022 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.view.JstlView            : View name 'login', model {}
2020-07-10 10:39:19.043 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.view.JstlView            : Forwarding to [/WEB-INF/jsp/login.jsp]
2020-07-10 10:39:19.160 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : Completed 404 NOT_FOUND
2020-07-10 10:39:19.163 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}
2020-07-10 10:39:19.168 DEBUG 11788 --- [nio-8282-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2020-07-10 10:39:19.664 DEBUG 11788 --- [nio-8282-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2020-07-10 10:39:19.684 DEBUG 11788 --- [nio-8282-exec-1] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 404

请帮我找出问题所在。

共有1个答案

居星阑
2023-03-14

首先,您试图使用jar提供jsp视图。Spring Boot文档本身提供了jsp与jar打包不匹配的信息。因此,将包装从jar更改为war。然后,确保jsp文件被放置在WEB-INF下,就像您在应用程序中提供的那样。属性。最可能的问题是,jsp没有包含在jar中,因为它位于WEB-INF文件夹中。

问题是,当您使用java-*。jar要部署springboot应用程序,jsp文件将不会出现在嵌入式tomcat中,并且在尝试服务请求时,您将得到一个404未找到的页面。这是因为jar打包,jsp文件没有从WEB-INF文件夹中复制。如果在使用jar作为打包时将jsp文件保存在META-INF/resources文件夹下,它应该可以工作。

相关:为什么Spring Boot不支持jsp,而如果我们添加适当的jar引用,它可以呈现页面

 类似资料:
  • 我正在处理一个Spring boot项目,我使用了JSP文件并提供了Whitelabel错误页面。有一个意外的错误(type=Not ville, status=404)。 我已经将JSP放在/src/main/webapp/pages/中,并且已经用应用程序属性给出了路径。 这有几个模块,主要组件不包括Spring Boot依赖性,它只包括所需的特定模块。从其他模块继承的代码已用于Spring

  • 我在路径“/test”中有一个无用的endpoint: 我这样测试: 但我得到一个断言错误: 预期状态代码 这发生在更多的代码中:400,500...除了200。 我用的是Spring靴。如果在运行测试时在endpoint方法中放置断点,则执行将停止,因此测试中的请求将正确完成。如果我将状态代码(在资源和测试中也是)更改为200,则测试通过。 到底发生了什么?

  • 问题内容: 我试图按照此链接中的建议将错误返回到对控制器的调用,以便客户端可以采取适当的措施。javascript通过jqueryAJAX调用控制器。仅在不将状态设置为error的情况下,我才可以重新获得Json对象。这是示例代码 如果没有设置状态码,我会得到Json。如果设置状态代码,则会返回状态代码,但不会返回Json错误对象。 更新 我想将Error对象作为JSON发送,以便可以处理ajax

  • 我试图使一个API工作在springstart但是当我输入请求:http://localhost:8080/employee/all我得到这个结果: 它是一个经典的服务,包含一个模型、一个服务、一个存储库、一个映射器和一个异常(如果没有员工),使用的数据库是sql中的实体,如下所示 服务: 仓库 模型 制图员 例外 波姆。xml

  • 我得到一个AWS错误代码:SignatureDoesNotMatch,状态代码:403时,试图通过亚马逊SES发送邮件。 我已经确认我正在使用通过https://console.aws.amazon.com/iam/home?#users创建的正确凭据,错误仍然存在。 我假设我在iam/home上创建的凭据实际上是全局的,但我不知道我进一步做错了什么。整个错误是: AWS错误代码:Signatur

  • 我正试图从GKE重新部署到Digital Ocean。我遇到了一个问题,来自letsencrypt的挑战。我相信K8s告诉我找不到路线。letsencrypt试图完成挑战并失败的两个主机名/域是SendGrid使用的CNAMES。我真的不知道从哪里开始故障排除,我的谷歌功能让我失望。 我的配置图如下所示: