Spring Загрузите страницу ошибки Whitelabel
Я пытаюсь удалить страницу с ошибкой белого ярлыка, так что я сделал, было создано сопоставление контроллера для "/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
Не знаю, что я делаю что-то неправильно. Пожалуйста, совет.
EDIT:
Уже добавлено error.whitelabel.enabled=false
в файл application.properties, все еще получая ту же ошибку
Ответы
Ответ 1
Вам необходимо изменить свой код на следующее:
@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;
}
}
Ваш код не работал, потому что Spring Boot автоматически регистрирует BasicErrorController
как Spring Bean, если вы не указали реализацию ErrorController
.
Чтобы увидеть этот факт, просто перейдите к ErrorMvcAutoConfiguration.basicErrorController
здесь.
Ответ 2
Если вы хотите получить более "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);
}
}
Ответ 3
Вы можете полностью удалить его, указав:
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration;
...
@Configuration
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public static MainApp { ... }
Однако обратите внимание, что это приведет к тому, что вместо этого отобразятся страницы с белыми ячейками сервлета:)
EDIT: Другой способ сделать это через application.yaml. Просто введите значение:
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration
Документация
Ответ 4
Spring boot doc 'был неправильным (исправленным):
Чтобы отключить его, вы можете установить error.whitelabel.enabled= false
должен быть
Чтобы отключить его, вы можете установить server.error.whitelabel.enabled= false
Ответ 5
В руководстве здесь указано, что вы должны установить server.error.whitelabel.enabled
в false
, чтобы отключить стандартную страницу ошибок. Может, это то, что вы хотите?
Я, кстати, испытываю ту же ошибку после добавления/сопоставления ошибок.
Ответ 6
С помощью Spring Boot > 1.4.x вы можете сделать это:
@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class})
public class MyApi {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
но затем в случае исключения контейнер сервлета отобразит собственную страницу ошибок.
Ответ 7
В Spring Boot 1.4.1 с использованием шаблонов Mustache размещения пакета templates в файле tem.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
Ответ 8
server.error.whitelabel.enabled = ложь
Включите указанную выше строку в папку Ресурсы application.properties
Подробнее о проблеме с устранением ошибки см. http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page