我正在尝试删除白标错误页面,所以我所做的是为"/ 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文件中,仍然会收到相同的错误
您需要将代码更改为以下内容:
@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
这里.
Spring boot doc ''错了(他们已修复它):
要关闭它,您可以设置error.whitelabel.enabled = false
应该
要关闭它,您可以设置server.error.whitelabel.enabled = false
您可以通过指定完全删除它:
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
.
手册在这里说,你必须设置server.error.whitelabel.enabled
以false
禁用标准错误页面.也许这就是你想要的?
顺便说一句,我在添加/错误映射后遇到了同样的错误.
如果你想要一个更"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); } }
这取决于你的春季靴子版本:
当SpringBootVersion <= 1.2
然后使用error.whitelabel.enabled = false
当SpringBootVersion > = 1.3
然后使用server.error.whitelabel.enabled = false
使用Spring Boot> 1.4.x,您可以这样做:
@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class}) public class MyApi { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
但是如果异常,servlet容器将显示自己的错误页面.
在使用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