Spring Boot删除Whitelabel错误页面


156

我正在尝试删除白标签错误页面,所以我所做的是为“ / error”创建了一个控制器映射,

@RestController
public class IndexController {

    @RequestMapping(value = "/error")
    public String error() {
        return "Error handling";
    }

}

但是现在我得到了这个错误。

Exception in thread "AWT-EventQueue-0" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource   [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Invocation  of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'basicErrorController' bean method 
public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>>  org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletR equest)
to {[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'indexController' bean method

不知道我做错了什么。请指教。

编辑:

已经添加 error.whitelabel.enabled=false 到application.properties文件中,仍然出现相同的错误


1
看看这个项目github.com/paulc4/mvc-exceptions/blob/master/src/main/java/…,似乎他们在其中重新映射了错误页面。
Innot Kauker 2014年

您尝试过设置spring.resources.add-mappings=false吗?
geoand 2014年

感谢您的建议,是的还是有同样的错误
Yasitha Waduge 2014年

您只是在尝试/error调用路径时返回一些自定义内容吗?
geoand 2014年

Answers:


240

您需要将代码更改为以下内容:

@RestController
public class IndexController implements ErrorController{

    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public String error() {
        return "Error handling";
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}

您的代码无法正常工作,因为BasicErrorController当您未指定的实现时,Spring Boot会自动将其注册为Spring Bean ErrorController

要查看该事实,请导航至ErrorMvcAutoConfiguration.basicErrorController 此处


1
遇到同样的问题,我搜索了Spring文档,但没有提到BasicErrorController。这有效:)
Mike R

4
我必须
仔细检查

1
谢谢,做得很好!如果可以提供任何指示,可以进行一些小的跟进:说我们进入这个错误处理程序,因为在我们的应用程序中抛出了一些异常(Spring隐式地将响应代码设置为500,这是正确的);有没有一种简单的方法可以在这里获取该异常(在返回的错误消息中包含一些详细信息)?
Jonik

1
很高兴您发现它有用!虽然我还没有尝试过,我敢肯定,你可以使用原则春天启动的发现BasicErrorController(见github.com/spring-projects/spring-boot/blob/...)来完成你想要的东西
geoand

3
嗯,是的,再次感谢!最初我不确定如何获取该ErrorAttributes对象(包含错误详细信息),但是后来我尝试了简单的@Autowiring,它就可以了。我现在要处理的是:gist.github.com/jonikarppinen/662c38fb57a23de61c8b
Jonik

44

如果您想要一个更“ JSONish”的响应页面,可以尝试这样的操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;

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

@RestController
@RequestMapping("/error")
public class SimpleErrorController implements ErrorController {

  private final ErrorAttributes errorAttributes;

  @Autowired
  public SimpleErrorController(ErrorAttributes errorAttributes) {
    Assert.notNull(errorAttributes, "ErrorAttributes must not be null");
    this.errorAttributes = errorAttributes;
  }

  @Override
  public String getErrorPath() {
    return "/error";
  }

  @RequestMapping
  public Map<String, Object> error(HttpServletRequest aRequest){
     Map<String, Object> body = getErrorAttributes(aRequest,getTraceParameter(aRequest));
     String trace = (String) body.get("trace");
     if(trace != null){
       String[] lines = trace.split("\n\t");
       body.put("trace", lines);
     }
     return body;
  }

  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 aRequest, boolean includeStackTrace) {
    RequestAttributes requestAttributes = new ServletRequestAttributes(aRequest);
    return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
  }
}

7
在Spring-Boot v2中,ErrorController和ErrorAttributes类位于org.springframework.boot.web.servlet.error包中,并且ErrorAttributes#getErrorAttributes方法签名已更改,请注意对Spring-Boot v1的依赖关系,并可能为v2提供提示,谢谢。
chrisinmtown

1
更改:私有Map <String,Object> getErrorAttributes(HttpServletRequest aRequest,boolean includeStackTrace){RequestAttributes requestAttributes = new ServletRequestAttributes(aRequest); 返回errorAttributes.getErrorAttributes(requestAttributes,includeStackTrace); }通过:private Map <String,Object> getErrorAttributes(HttpServletRequest request,boolean includeStackTrace){WebRequest webRequest = new ServletWebRequest(request); 返回this.errorAttributes.getErrorAttributes(webRequest,includeStackTrace); }
Rija Ramampiandra


38

Spring Boot doc “是”错误的(他们已经修复了它):

要关闭它,您可以设置error.whitelabel.enabled = false

应该

要关闭它,可以设置server.error.whitelabel.enabled = false


这将禁用“白色标签错误页面”,但/error无论如何Spring Boot都会映射端点。释放端点/errorserver.error.path=/error-spring或某些替代路径。
notes-jj

32

您可以通过指定以下内容将其完全删除:

import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
...
@Configuration
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public static MainApp { ... }

但是,请注意,这样做可能会导致显示servlet容器的whitelabel页面:)


编辑:另一种方法是通过application.yaml。只需输入值:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

文献资料

对于Spring Boot <2.0,该类位于package中org.springframework.boot.autoconfigure.web


15

这里的手册说您必须设置server.error.whitelabel.enabledfalse禁用标准错误页面。也许这就是您想要的?

顺便说一句,添加/错误映射后,我遇到同样的错误。


是的,我已经设置了error.whitelabel.enabled = false,但是在添加/ error映射后仍然出现相同的错误
Yasitha Waduge 2014年

这将禁用“白色标签错误页面”,但/error无论如何Spring Boot都会映射端点。释放端点/errorserver.error.path=/error-spring或某些替代路径。
notes-jj

11

使用Spring Boot> 1.4.x,您可以执行以下操作:

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

但是如果出现异常,则Servlet容器将显示其自己的错误页面。



6

在使用Mustache模板的Spring Boot 1.4.1中,在模板文件夹下放置error.html就足够了:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>Error</title>
</head>

<body>
  <h1>Error {{ status }}</h1>
  <p>{{ error }}</p>
  <p>{{ message }}</p>
  <p>{{ path }}</p>
</body>

</html>

通过为以下对象创建拦截器可以传递其他变量 /error



3

这是另一种替代方法,与“旧方法”中指定错误映射的方法非常相似 web.xml

只需将其添加到您的Spring Boot配置中即可:

@SpringBootApplication
public class Application implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        factory.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN, "/errors/403.html"));
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404.html"));
        factory.addErrorPages(new ErrorPage("/errors/500.html"));
    }

}

然后,您可以正常地在静态内容中定义错误页面。

@Component如果需要,定制器也可以是单独的。


3

我正在使用Spring Boot版本2.1.2和 errorAttributes.getErrorAttributes()签名对我不起作用(在acohen的响应中)。我想要一个JSON类型的响应,所以我做了一些挖掘,发现此方法完全符合我的需要。

我从此主题以及此博客文章中获得了大部分信息

首先,我创建了一个CustomErrorControllerSpring会寻找任何错误的映射。

package com.example.error;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
public class CustomErrorController implements ErrorController {

    private static final String PATH = "error";

    @Value("${debug}")
    private boolean debug;

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(PATH)
    @ResponseBody
    public CustomHttpErrorResponse error(WebRequest request, HttpServletResponse response) {
        return new CustomHttpErrorResponse(response.getStatus(), getErrorAttributes(request));
    }

    public void setErrorAttributes(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    private Map<String, Object> getErrorAttributes(WebRequest request) {
        Map<String, Object> map = new HashMap<>();
        map.putAll(this.errorAttributes.getErrorAttributes(request, this.debug));
        return map;
    }
}

其次,我创建了一个CustomHttpErrorResponse将错误返回为JSON的类。

package com.example.error;

import java.util.Map;

public class CustomHttpErrorResponse {

    private Integer status;
    private String path;
    private String errorMessage;
    private String timeStamp;
    private String trace;

    public CustomHttpErrorResponse(int status, Map<String, Object> errorAttributes) {
        this.setStatus(status);
        this.setPath((String) errorAttributes.get("path"));
        this.setErrorMessage((String) errorAttributes.get("message"));
        this.setTimeStamp(errorAttributes.get("timestamp").toString());
        this.setTrace((String) errorAttributes.get("trace"));
    }

    // getters and setters
}

最后,我必须关闭application.properties文件中的Whitelabel 。

server.error.whitelabel.enabled=false

这甚至应该用于xml请求/响应。但是我还没有测试过。自从创建RESTful API以来,它确实满足了我的期望,并且只想返回JSON。


2

server.error.whitelabel.enabled = false

将以上行添加到资源文件夹application.properties中

解决更多错误问题,请参阅http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page


我在安装文件夹中尝试了application.properties,但没有执行任何操作。suganya sudarsan试图传达/ src / main / resources下的application.properties文件夹。在Eclipse中,这似乎也是“热门阅读”。
理查德·布拉德利·史密斯

1

我试图从微服务中调用REST端点,并且使用了resttemplate的put方法。

在我的设计中,如果REST端点内部发生任何错误,则它应该返回JSON错误响应,它在某些调用中有效,但在此放置调用中无效,而是返回了白标签错误页面

因此,我进行了一些调查,结果发现了这一点;

Spring尝试了解调用方,如果它是一台机器,则返回JSON响应,或者如果它是浏览器,则返回白色标签错误页面 HTML。

结果:我的客户端应用程序需要向REST端点说调用者是一台机器,而不是浏览器,因此,客户端应用程序需要添加' application / json为resttemplate的“ put”方法显式地 ”到ACCEPT标头中。我将此添加到标题并解决了问题。

我对端点的呼叫:

restTemplate.put(url, request, param1, param2);

对于上面的调用,我必须在标题下方添加参数。

headers.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);

或者我也尝试更改put来交换,在这种情况下,exchange调用也为我添加了相同的标头并解决了问题,但我不知道为什么:)

restTemplate.exchange(....)

0

默认情况下,Spring Boot有一个“ whitelabel ”错误页面,如果遇到服务器错误,您可以在浏览器中看到它。Whitelabel Error Page是通用的Spring Boot错误页面,在未找到自定义错误页面时显示。

设置“ server.error.whitelabel.enabled = false”以切换默认错误页面


0

每当刷新时,Angular SPA上都会出现类似的WhiteLabel错误消息。

解决的办法是创建一个实现ErrorController的控制器,但是我不必返回一个String,而是必须返回一个ModelAndView对象,该对象转发到 /

@CrossOrigin
@RestController
public class IndexController implements ErrorController {
    
    private static final String PATH = "/error";
    
    @RequestMapping(value = PATH)
    public ModelAndView saveLeadQuery() {           
        return new ModelAndView("forward:/");
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}
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.