스프링 부트 제거 Whitelabel 오류 페이지


156

화이트 라벨 오류 페이지를 제거하려고하는데 "/ 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

내가 잘못하고 있는지 모르겠다. 조언을 부탁드립니다.

편집하다:

error.whitelabel.enabled=false application.properties 파일에 이미 추가 되었지만 여전히 동일한 오류가 발생합니다.


1
이 프로젝트 github.com/paulc4/mvc-exceptions/blob/master/src/main/java/… 를보십시오. 오류 페이지를 다시 매핑하는 것 같습니다.
Innot Kauker

설정을 시도 했습니까 spring.resources.add-mappings=false?
geoand

제안 주셔서 감사합니다, 예 여전히 같은 오류가 발생했습니다
Yasitha Waduge에게

/error경로가 호출 될 때 일부 사용자 정의 컨텐츠를 반환하려고 합니까?
geoand

답변:


240

코드를 다음과 같이 변경해야합니다.

@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 여기로 이동 하십시오 .


1
같은 문제에 동일한 문제가 발생하여 Spring 문서를 검색했지만 BasicErrorController는 언급하지 않았습니다. 작동 :)
Mike R

4
나는이 일을 :-) 찾기 위해 소스를 통해 가야했다
geoand

1
고마워요, 잘 작동했습니다! 포인터를 줄 수 있다면 작은 후속 조치 : 응용 프로그램에서 예외가 발생했기 때문에이 오류 처리기에 도달한다고 가정하십시오 (Spring은 응답 코드를 암시 적으로 500으로 암시 적으로 설정합니다). 이 예외를 쉽게 잡을 수있는 방법이 있습니까 (오류 메시지에 세부 정보를 포함 시키려면)?
Jonik

1
유용하다고 생각해서 다행입니다! 나는 그것을 시도하지 않은 있지만, 나는 꽤 당신이 원칙을 사용할 수 있다는 생각 봄 부팅의 발견 BasicErrorController(참조 github.com/spring-projects/spring-boot/blob/... 당신이 원하는 것을 달성하기 위해)
geoand

3
흠, 다시 한번 감사합니다! 처음 ErrorAttributes에는 오류 세부 정보를 포함하여 해당 객체 를 얻는 방법을 모르지만 단순히 @Autowiring을 시도하면 작동합니다. 내가 지금 함께 갔다 : gist.github.com/jonikarppinen/662c38fb57a23de61c8b
Jonik

44

더 "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);
  }
}

7
Spring-Boot v2에서 ErrorController 및 ErrorAttributes 클래스는 org.springframework.boot.web.servlet.error 패키지에 있으며 ErrorAttributes # getErrorAttributes 메소드 서명이 변경되었습니다. 고마워.
chrisinmtown

1
변경 : 개인용 Map <String, Object> getErrorAttributes (HttpServletRequest aRequest, boolean includeStackTrace) {RequestAttributes requestAttributes = 새 ServletRequestAttributes (aRequest); return errorAttributes.getErrorAttributes (requestAttributes, includeStackTrace); } 작성자 : 개인 Map <String, Object> getErrorAttributes (HttpServletRequest 요청, boolean includeStackTrace) {WebRequest webRequest = 새로운 ServletWebRequest (요청); this.errorAttributes.getErrorAttributes (webRequest, includeStackTrace)를 반환합니다. }
Rija Ramampiandra

2
위의 의견을 고려 SimpleErrorController.java의 업데이트 된 버전은 여기에서 찾을 수 있습니다> gist.github.com/oscarnevarezleal/...
오스카 Nevarez

38

스프링 부트 문서 '잘못된'(그 이후 수정되었습니다) :

전원을 끄려면 error.whitelabel.enabled = false를 설정할 수 있습니다

해야한다

전원을 끄려면 server.error.whitelabel.enabled = false를 설정할 수 있습니다


이렇게하면 화이트 레이블 오류 페이지가 비활성화되지만 스프링 부트는 엔드 포인트를 매핑합니다 /error. 엔드 포인트 /error세트 server.error.path=/error-spring또는 일부 대체 경로를 해제합니다.
notes-jj

32

다음을 지정하여 완전히 제거 할 수 있습니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
...
@Configuration
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public static MainApp { ... }

그러나 그렇게하면 서블릿 컨테이너의 화이트 라벨 페이지가 대신 나타날 수 있습니다.


편집 : 다른 방법은 application.yaml을 사용하는 것입니다. 값을 입력하십시오.

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

선적 서류 비치

Spring Boot <2.0의 경우 클래스는 package에 org.springframework.boot.autoconfigure.web있습니다.


15

수동 여기에는 사용자가 설정해야한다는라고 server.error.whitelabel.enabled하는 false표준 오류 페이지를 해제 할 수 있습니다. 어쩌면 그것은 당신이 원하는 것입니까?

그건 그렇고 / 오류 매핑을 추가 한 후 동일한 오류가 발생합니다.


예, error.whitelabel.enabled = false를 이미 설정했지만 / error 매핑을 추가 한 후에도 여전히 같은 오류가 발생합니다
Yasitha Waduge

이렇게하면 화이트 레이블 오류 페이지가 비활성화되지만 스프링 부트는 엔드 포인트를 매핑합니다 /error. 엔드 포인트 /error세트 server.error.path=/error-spring또는 일부 대체 경로를 해제합니다.
notes-jj

11

Spring Boot> 1.4.x를 사용하면 다음을 수행 할 수 있습니다.

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

그러나 예외의 경우 서블릿 컨테이너는 자체 오류 페이지를 표시합니다.



6

Spring Boot 1.4.1에서 Mustache 템플릿을 사용하는 경우 템플릿 폴더 아래에 error.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



3

에 오류 매핑을 지정하는 "오래된 방법"과 매우 유사한 대체 방법이 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원하는 경우 커 스터 마이 저는 별도 일 수도 있습니다 .


3

Spring Boot 버전 2.1.2를 사용하고 있습니다. errorAttributes.getErrorAttributes() 서명이 작동하지 않습니다 (아 코헨의 답변). JSON 유형의 응답을 원했기 때문에 약간 파고이 방법이 필요한 것을 정확하게 수행했습니다.

이 글과 블로그 게시물 에서 대부분의 정보를 얻었 습니다. .

먼저 CustomErrorControllerSpring에서 오류를 매핑 할 것을 만들었습니다 .

package com.example.error;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
public class CustomErrorController implements ErrorController {

    private static final String PATH = "error";

    @Value("${debug}")
    private boolean debug;

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(PATH)
    @ResponseBody
    public CustomHttpErrorResponse error(WebRequest request, HttpServletResponse response) {
        return new CustomHttpErrorResponse(response.getStatus(), getErrorAttributes(request));
    }

    public void setErrorAttributes(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    private Map<String, Object> getErrorAttributes(WebRequest request) {
        Map<String, Object> map = new HashMap<>();
        map.putAll(this.errorAttributes.getErrorAttributes(request, this.debug));
        return map;
    }
}

둘째, CustomHttpErrorResponse오류를 JSON으로 반환 하는 클래스를 만들었습니다 .

package com.example.error;

import java.util.Map;

public class CustomHttpErrorResponse {

    private Integer status;
    private String path;
    private String errorMessage;
    private String timeStamp;
    private String trace;

    public CustomHttpErrorResponse(int status, Map<String, Object> errorAttributes) {
        this.setStatus(status);
        this.setPath((String) errorAttributes.get("path"));
        this.setErrorMessage((String) errorAttributes.get("message"));
        this.setTimeStamp(errorAttributes.get("timestamp").toString());
        this.setTrace((String) errorAttributes.get("trace"));
    }

    // getters and setters
}

마지막으로 application.properties파일 에서 Whitelabel을 해제해야했습니다 .

server.error.whitelabel.enabled=false

xml요청 / 응답 에도 작동합니다 . 그러나 나는 그것을 테스트하지 않았습니다. RESTful API를 작성하고 JSON을 반환하기를 원했기 때문에 내가 원하는 것을 정확하게 수행했습니다.


2

server.error.whitelabel.enabled = false

위의 행을 자원 폴더 application.properties에 포함하십시오.

더 많은 오류 문제 해결은 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page 를 참조 하십시오


설치 폴더에서 application.properties를 시도했지만 아무것도하지 않았습니다. / src / main / resources 아래의 application.properties 폴더는 suganya sudarsan이 전달하려고 시도한 것입니다. Eclipse에서도 "핫 리드"인 것으로 보입니다.
Richard Bradley Smith

1

마이크로 서비스에서 REST 엔드 포인트를 호출하려고 시도하고 resttemplate의 put 메소드를 사용하고있었습니다 .

나머지는 그것이 어떤 통화 일하고 있지만이 들어, JSON 오류 응답을 반환해야 엔드 포인트 내에서 내 디자인에서 오류가 발생하는 경우 넣어 하나가 반환 화이트 라벨 오류 페이지를 대신.

그래서 나는 약간의 조사를했고 그것을 알게되었습니다.

Spring은 호출자가 기계 인 경우 호출자를 이해하려고 시도하고 JSON 응답을 반환하거나 브라우저가 화이트 레이블 오류 페이지 HTML을 반환하는 것보다 브라우저인지 확인합니다 .

결과 : 내 클라이언트 응용 프로그램은 호출자가 브라우저가 아닌 기계라고 REST 엔드 포인트에 말해야하므로 클라이언트 응용 프로그램 은 resttemplate의 'put'메소드에 대해 명시 적으로 ACCEPT 헤더 에 ' application / json ' 을 추가해야했습니다 . 이것을 헤더에 추가하고 문제를 해결했습니다.

엔드 포인트 호출 :

restTemplate.put(url, request, param1, param2);

위의 호출을 위해 헤더 매개 변수 아래에 추가해야했습니다.

headers.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);

또는 교환을 위해 put을 변경하려고 시도했지만이 경우 교환 호출이 동일한 헤더를 추가하고 문제를 해결했지만 이유를 모르겠습니다. :)

restTemplate.exchange(....)

0

스프링 부트는 기본적으로 " whitelabel 에는 서버 오류가 발생하면 브라우저에 표시되는 ”오류 페이지가 있습니다. Whitelabel Error Page는 사용자 정의 오류 페이지가 없을 때 표시되는 일반적인 스프링 부트 오류 페이지입니다.

“server.error.whitelabel.enabled = false”를 기본 오류 페이지로 전환하십시오.


0

새로 고칠 때마다 Angular SPA에 비슷한 문제 WhiteLabel 오류 메시지가 나타납니다.

수정은 ErrorController를 구현하는 컨트롤러를 만드는 것이었지만 String을 반환하는 대신 /로 전달하는 ModelAndView 개체를 반환해야했습니다.

@CrossOrigin
@RestController
public class IndexController implements ErrorController {
    
    private static final String PATH = "/error";
    
    @RequestMapping(value = PATH)
    public ModelAndView saveLeadQuery() {           
        return new ModelAndView("forward:/");
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.