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 для приложения.свойства файла, все еще получая ту же ошибку

733   11  

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

    Ничего не найдено.