Spring Boot删除Whitelabel错误页面

 小Q理性的激情农_885 发布于 2022-12-27 14:00

我正在尝试删除白标错误页面,所以我所做的是为"/ 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>  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文件中,仍然会收到相同的错误

8 个回答
  • 您需要将代码更改为以下内容:

    @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 这里.

    2022-12-27 14:00 回答
  • Spring boot doc ''错了(他们已修复它):

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

    应该

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

    2022-12-27 14:01 回答
  • 您可以通过指定完全删除它:

    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,该类位于包中org.springframework.boot.autoconfigure.web.

    2022-12-27 14:01 回答
  • 手册在这里说,你必须设置server.error.whitelabel.enabledfalse禁用标准错误页面.也许这就是你想要的?

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

    2022-12-27 14:01 回答
  • 如果你想要一个更"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);
      }
    }
    

    2022-12-27 14:01 回答
  • 这取决于你的春季靴子版本:

    当SpringBootVersion <= 1.2然后使用error.whitelabel.enabled = false

    当SpringBootVersion > = 1.3然后使用server.error.whitelabel.enabled = false

    2022-12-27 14:03 回答
  • 使用Spring Boot> 1.4.x,您可以这样做:

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

    但是如果异常,servlet容器将显示自己的错误页面.

    2022-12-27 14:03 回答
  • 在使用Mustache模板的Spring Boot 1.4.1中,将errors.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

    2022-12-27 14:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有