Spring Boot Удалить Страницу С Ошибкой 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 для приложения.свойства файла, все еще получая ту же ошибку
11 ответов:
вам нужно изменить код следующим образом:
@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здесь.
Если вы хотите более" 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); } }
вы можете удалить его, выполнив следующую команду:
import org.springframework.context.annotation.Configuration; import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration; ... @Configuration @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) public static MainApp { ... }однако обратите внимание, что это, вероятно, приведет к появлению белых страниц контейнера сервлета:)
EDIT: другой способ сделать это с помощью приложения.и YAML. Просто введите значение:
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfigurationдля Spring Boot org.springframework.boot.autoconfigure.web.
Spring boot doc "было" неправильно (они с тех пор исправили это):
чтобы отключить его, вы можете установить ошибка.whitelabel.включено = false
должно быть
чтобы отключить его, вы можете установить сервер.ошибка.whitelabel.включено = false
руководство здесь говорит, что вы должны установить
server.error.whitelabel.enabledдоfalseотключить стандартную страницу ошибки. Может быть, это то, что вы хотите?Я испытываю ту же ошибку после добавления /отображения ошибок, кстати.
С Пружинной Загрузкой > 1.4.х вы могли бы сделать это:
@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class}) public class MyApi { public static void main(String[] args) { SpringApplication.run(App.class, args); } }но тогда в случае исключения сервлет контейнер будет отображать свою собственную страницу ошибки.
Это зависит от вашей версии spring boot:
, когда SpringBootVersion 1.2 затем использовать
error.whitelabel.enabled = false, когда SpringBootVersion>=
1.3затем использоватьserver.error.whitelabel.enabled = false
в Spring Boot 1.4.1 с помощью шаблонов усов, размещение ошибки.html в папке templates будет достаточно:
<!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
сервер.ошибка.whitelabel.включено=false
включите указанную выше строку в приложение папки ресурсов.свойства
больше ошибок решение проблемы, пожалуйста, обратитесь http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page
вот альтернативный метод, который очень похож на" старый способ " указания отображений ошибок в
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при желании.
Я пытался называть конечную точку REST из микрослужб и я был с помощью resttemplate по поставить метод.
В моем дизайне, если какая-либо ошибка произошла внутри конечной точки REST, она должна возвращать ответ на ошибку JSON, он работал для некоторых вызовов, но не для этого поставить один, он вернулся в страница ошибки белой метки.
поэтому я провел некоторое расследование, и я узнал, что;
Весна попробуйте понять вызывающий объект, если это машина, то он возвращает ответ JSON или если это браузер, чем он возвращает страница ошибки белой метки HTML.
в результате: мое клиентское приложение должно было сказать REST endpoint, что вызывающий абонент является машиной, а не браузером, поэтому для этого клиентское приложение должно было добавить ' application / json ' в заголовок ACCEPT явно для метода resttemplate 'put'. Я добавил Это в заголовок и решил проблему.
мой вызов конечная точка:
restTemplate.put(url, request, param1, param2);для выше вызова мне пришлось добавить ниже заголовок param.
headers.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);или я попытался изменить put на exchange, в этом случае exchange call добавил тот же заголовок для меня и тоже решил проблему, но я не знаю, почему :)
restTemplate.exchange(....)
Comments