此应用程序没有针对/ error的显式映射


107

我用maven编写了教程https://spring.io/guides/gs/uploading-files/
复制了我使用的所有代码。

该应用程序可以运行,但是出现错误:

Whitelabel Error Page此应用程序没有针对/ error的显式映射,因此您将其视为后备。Tue Jun 30 17:24:02 CST 2015有一个意外错误(类型=未找到,状态= 404)。无可用讯息

我该如何解决?


在帖子中添加了评论-您可以自己编辑。这比评论您自己的帖子更好
亚历山大

Answers:


137

确保您的主类位于其他类之上的根包中。

当您运行Spring Boot应用程序(即带有@SpringBootApplication注释的类)时,Spring将仅扫描主类包下方的类。

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java

4
高于还是相同水平?
Martin Erlic '17

21
我花了将近2个小时来解决这个问题!
拉克什

7
也尝试过。仍然错误。至少主页,即localhost:8080应该向我显示Tomcat主页,不是吗?但这也没有显示
zulkarnain shah

感谢您的提示。我曾经是Eclipse用户,不需要此配置,但是现在我使用的是IntelliJ,这是非常有希望的。
Armer B.19年

@zulkarnainshah通常的tomcat主页由此处未包含的WAR生成。
托尔比约恩Ravn的安德森

61

当我们创建一个Spring Boot应用程序时,我们用注解对其进行@SpringBootApplication注解。该批注“包装”了许多其他必要的批注,以使应用程序正常工作。一种这样的注释是@ComponentScan注释。该注释告诉Spring寻找Spring组件并配置要运行的应用程序。

您的应用程序类必须位于程序包层次结构的顶层,以便Spring可以扫描子程序包并找到其他必需的组件。

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

下面的代码片段适用于控制器程序包位于com.test.spring.boot程序包下的情况

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

以下代码段 不起作用,因为控制器软件包不在com.test.spring.boot软件包中

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

从Spring Boot文档中:

许多春季引导开发者总是有其主类注解为@Configuration@EnableAutoConfiguration@ComponentScan。由于这些注释经常一起使用(特别是如果您遵循上述最佳实践),因此Spring Boot提供了一种方便的@SpringBootApplication替代方法。

@SpringBootApplication注解相当于使用 @Configuration@EnableAutoConfiguration@ComponentScan与他们的默认属性


3
非常好的解释。谢谢
Lova Chittumuri

39

您可以通过ErrorController在应用程序中添加来解决此问题。您可以让错误控制器返回所需的视图。

我的应用程序中的错误控制器如下所示:

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

上面的类基于Springs BasicErrorController类。

您可以ErrorController@Configuration文件中实例化以上内容:

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

您可以ErrorAttributes通过实现ErrorAttributes选择覆盖默认值。但是在大多数情况下,DefaultErrorAttributes应该足够。


1
您到BasicErrorController404类的链接。
Stephane

@owaism:的链接BasicErrorController已不再有效,您可以更新吗?
HDJEMAI

1
的链接BasicErrorController现已固定。
axiopisty '18

14

在我的情况下,控制器类带有注释@Controller。进行更改以@RestController解决问题。基本上@RestController@Controller + @ResponseBody 因此,无论使用@RestController,或@Controller@ResponseBody每个方法注释。

一些有用的注释在这里:https : //www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


它可以工作,但是按照示例,整个Internet的基本配置都应该与@Controller一起工作。任何机构都知道为什么只有RestController工作的原因吗?
超新星

在用类对类进行注释时,@RestController会隐式添加@ResponseBody注释,但是,如果您使用的是@Controller注释,则必须自己显式添加该注释。
罗宾·凯斯基萨卡

10

就我而言,这是因为包的位置,这意味着控制器的包必须在主类包之上

如果我的主类软件包是package co.companyname.spring.tutorial;任何控制器软件包,package co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

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


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController 
public class HelloController { 

@RequestMapping("/hello")  
public String hello() {   
 return "Hello, world"; 
 }}

完成编码后,按启动仪表板

在此处输入图片说明

确保您的控制器正在映射或不只是控制台的最后一件事,您应该会感到有些刺耳

Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

快乐编码


9

如果未定义显式错误页面,则会发生这种情况。要定义错误页面,请创建带有视图的/ error映射。例如,下面的代码映射到在发生错误的情况下返回的字符串值。

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}

您可以在代码中添加一些说明吗?为什么它解决了这个关键部分呢?
Nico Haase

相对于Spring Boot,在此答案中要注意一件事,这让我一开始有些头疼。实施springframework的ErrorController接口很重要。如果未创建映射到“ /错误”的控制器端点,则将收到一条错误消息,告知您该方法已被映射。
mmaynar1

8

尝试添加依赖项。

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

2
这实际上是做什么的?
隐身拉比

我添加了此依赖关系,并且它起作用了。就像@StealthRabbi一样...我也想知道它实际上在做什么。
twindham

@StealthRabbi这将一个依赖关系添加到名为Thymeleaf的模板框架中,该框架是JSP的替代方法和首选方法。这个答案不是真正的答案imo,抛出依赖关系并不能帮助对核心问题真正感兴趣的人
Christian

5

我添加了此依赖关系,它解决了我的问题。

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

这是我的理论:如果我们使用“ @Controller”,Spring将以某种方式要求我们具有特定的模板引擎。在这种情况下,Thymeleaf。因此,需要spring-boot-starter-thymeleaf。而如果我们使用“ @RestController”,则Spring Boot不需要模板引擎。因此,它不使用Thymeleaf。
Yosi Pramajaya

4

我正在开发Spring Boot应用程序几周了。

Whitelabel Error Page此应用程序没有针对/ error的显式映射,因此您将其视为后备。Thu Jan 18 14:12:11 AST 2018有一个意外错误(type = Not Found,status = 404)。无可用讯息

当我得到此错误消息时,我意识到在我的项目中定义了控制器或Rest控制器类。我的意思是我们所有的控制器软件包都不是与包含@SpringBootApplication注释的主类相同的软件包。.我的意思是您需要将控制器软件包的名称添加到@ComponentScan注释的主类中,包括@SpringBootApplication注释。如果编写代码下面的问题将得到解决... 最重要的是,您必须像在下面所做的那样将所有控制器的程序包添加到@ComponentScan批注

package com.example.demo;

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

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

我希望这些代码可以帮助某人...

如果您找到解决此错误的另一种方法,或者对我有建议,请写评论...谢谢...


4

在主类中,在配置“ @SpringBootApplication”之后,添加“ @ComponentScan”而没有任何参数,对我有用!

主类:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

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

    }
}

RestController类:

@RestController
public class CommentStoreApp {

    @RequestMapping("/") 
    public String hello() {
        return "Hello World!";
    }
}

PS:启动应用程序之前,请不要错过运行mvn clean和mvn install命令


4

晚会很晚。根据Spring的官方文档,“如果遇到服务器错误,Spring Boot会安装一个白标签错误页面,您会在浏览器客户端中看到该页面。” https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. 您可以通过server.error.whitelabel.enabled=falseapplication.ymlapplication.properties文件中进行设置来禁用该功能。

2. 推荐的方法是设置您的错误页面,以便最终用户可以理解。在resources / templates文件夹下创建一个error.html文件,并在pom.xml文件中 添加依赖项

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

Spring将自动选择error.html页面作为默认错误模板。注意:-不要忘记添加依赖项后更新Maven项目。


3

您可能会收到错误,即

“此应用程序没有针对/ error的显式映射,因此您将其视为后备。”

这是因为它不会扫描您必须在main()类中指定的Controller&Service类,

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

注意:在这里,我指定了要扫描的各种类,例如demo,controller和service,只有它才能正常工作。


3

您必须组织这些程序包,以便该程序包包含公共静态main(或您在其中编写@SpringBootApplication的位置),它是所有其他程序包的父级。


-com.mypackage + nameApplication.java-com.mypachage.model-com.mypachage.controller-com.mypachage.dao
sakgeek

3

默认情况下,spring boot将扫描当前程序包以获取bean定义。因此,如果您当前定义主类的程序包和控制器程序包不相同或控制器程序包不是主应用程序程序包的子程序包,它将不会扫描控制器。为了解决这个问题,可以在主程序包中包含用于bean定义的程序包列表。

@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})

或创建一个包层次结构,其中子包是从主包派生的

package com.module.restapi;
package com.module.restapi.controller

2

问题是您要导航到localhost:8080 /而不是指南中指定的localhost:8080 / upload。当您导航到未定义的路由时,Spring Boot具有一个默认的错误页面,以避免泄露服务器特定的详细信息(可以将其视为安全隐患)。

您可以选择:访问右侧页面,添加自己的登录页面,或覆盖白色错误页面

为了简化这种特殊情况,我更新了指南,使其使用/代替/ upload。


2

我知道这并不能完全回答问题,但是首先出现在Google上的问题是:)

尝试访问Swagger UI时出现问题(“此应用程序没有针对/ error的显式映射”)。

在我的情况下,问题是由@RestController(“ / endpoint”)引起的,招摇无法正确处理。

因此,这导致了错误:

@RestController("/endpoint")
public class EndpointController {

这很好

@RestController
@RequestMapping("/endpoint")
public class EndpointController {

2

如果您忘记了控制器类顶部的@RestController注释,则可能会发生这种情况import import org.springframework.web.bind.annotation.RestController;

并添加如下注释

请参阅下面的简单示例

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

1

在控制器类中将@Controller更改为@RestController,一切应该顺利进行。


1

我也遇到了同样的错误,并且能够通过将以下依赖项添加到我的pom.xml中来解决该错误。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

原因是我们使用JSP作为视图。Spring Boot Starter Web的默认嵌入式servlet容器是tomcat。为了支持JSP,我们需要添加对tomcat-embed-jasper的依赖。

就我而言,我是从控制器返回JSP作为视图。希望这个答案可以帮助遇到同样问题的人。


1

我遇到了这个问题,后来意识到我@ConfigurationMvcConfig类中基本上缺少了对ViewControllersand 的映射的注释setViewNames

这是文件的内容:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

希望这对某人有帮助!!


这为我做到了。
Anthony Okoth,

1

确保依赖项列表中包含jasper和jstl:

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

这是一个正在工作的入门项目-https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

作者:Biju Kunjummen


1

我需要提到这种方式,并提供对软件包的引用,并且可以解决问题。您可以排除@EnableAutoConfiguration此注释,但是我需要绕过任何与数据库相关的依赖关系。

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"your package 1", "your package2"})

public class CommentStoreApplication {

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

    }
}


0

我为解决此类问题所做的一切只是在MVCConfig类中提到了@Configuration注释。

像这个 :

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

0

我有一个类似的错误,我使用spring boot和speed,我的解决方法是检查文件application.properties,spring.velocity.toolbox-config-location发现此属性是错误的


0

以我为例,当首先使用maven运行IntelliJ之后,从IntelliJ运行SpringApplication时,就会出现此问题。

为了解决这个问题,我先运行mvn clean。然后我从IntelliJ中运行SpringApplication。


0

确保您的主。应该在您的控制器之上。在以下示例的情况下:

Main.class包含:

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

EmployeeController。该类包含:

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

如果您的主类位于根文件夹中,则类似于以下路径:{projectname} / src / main / java / main,然后确保您的控制器位于主类之下。例如{projectname} / src / main / java / main / controllers


0

在具有主类的Java文件(例如:Viper.java)中,添加:“ @RestController”@RequestMapping(“ /”)

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}


0

这意味着您正在尝试访问不存在的页面。如果您在代码上使用@RequestMapping(“ / home”)并返回“ home.jsp”,则假设您的jsp文件现在位于/webapp/home.jsp;那么如果您尝试使用localhost:port /进行访问,则会收到此错误,但是如果尝试localhost:port / home则不会有错误,您可以通过检查@RequestMapping(“ /”)来解决此问题,在此将/ mapping_path您尝试访问的页面。您还可以尝试从maven依赖项添加tomcat jaspher的依赖项

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.