programing

스프링 부트 화이트 라벨 삭제 오류 페이지

lastmoon 2023. 3. 18. 09:15
반응형

스프링 부트 화이트 라벨 삭제 오류 페이지

화이트 라벨 에러 페이지를 삭제하려고 하고 있기 때문에, 「/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파일로 error 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;
    }
}

Boot은 으로 Spring Boot을 하기 때문에 .BasicErrorControllerSpring Bean의 ErrorController

하려면 , 「 」로 합니다.ErrorMvcAutoConfiguration.basicErrorController 여기 있습니다.

Spring Boot Doc 'was'가 잘못되었습니다(이후 수정되었습니다).

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

그래야 한다

이 기능을 끄려면 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);
  }
}

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

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

문서

Boot <는 Spring Boot < 2.0 > 패키지에 .org.springframework.boot.autoconfigure.web.

여기 매뉴얼에 따르면server.error.whitelabel.enabled로로 합니다.false표준 에러 페이지를 무효로 합니다.게게당 신하 ?? ????

덧붙여서 /error mapping을 추가해도 같은 에러가 발생하고 있습니다.

Spring Boot > 1.4.x 를 사용하면, 다음과 같이 할 수 있습니다.

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

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

이는 스프링 부트버전에 따라 달라집니다.

SpringBootVersion <=인 경우1.2으로 ' '를 사용합니다.error.whitelabel.enabled = false

SpringBootVersion > =인 경우1.3으로 ' '를 사용합니다.server.error.whitelabel.enabled = false

콧수염 템플릿을 사용하는 Spring Boot 1.4.1에서는 템플릿폴더 아래에 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

2.및 Spring Boot 버전 2.1.2를 하고 .errorAttributes.getErrorAttributes()(아코엔의 응답으로는) 서명이 통하지 않았습니다.JSON 타입의 응답을 원했기 때문에, 조금 조사해 보니, 이 방법이 딱 맞는 것을 알 수 있었습니다.

저는 이 스레드뿐만 아니라 이 블로그 게시물에서도 대부분의 정보를 얻었습니다.

first번, 는 a를 .CustomErrorController그 봄은 어떤 오류든 매핑할 수 있습니다.

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파일.

server.error.whitelabel.enabled=false

이 방법은 에 대해서도 유효합니다.xml리퀘스트/리퀘스트하지만 나는 그것을 테스트하지 않았다.RESTful API를 만들었기 때문에 JSON을 반환하고 싶었을 뿐입니다.

여기 에러 매핑을 지정하는 「구식」과 매우 유사한 대체 방법이 있습니다.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(필요한 경우).

Spring Boot 에는 디폴트로 서버 에러가 발생했을 경우에 브라우저에 표시되는 「화이트 라벨」에러 페이지가 있습니다.화이트 라벨 에러 페이지는, 커스텀에러 페이지를 찾을 수 없는 경우에 표시되는 일반적인 Spring Boot 에러 페이지입니다.

server.error를 설정합니다.기본 오류 페이지를 전환하려면 whitelabel.enabled=false"를 선택합니다.

새로고침할 때마다 Angular SPA에서 동일한 문제가 발생하는 White Label Error 메시지가 나타납니다.

수정은 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;
    }
}

server.error.whitelabel.enabled=false

위의 행을 Resources 폴더 application.properties에 포함합니다.

기타 오류 문제 해결 방법은 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ #how to-to-to-the-displabel-error 페이지를 참조하십시오.

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

설계상 REST 엔드포인트 내에서 오류가 발생하면 JSON 오류 응답을 반환해야 합니다.일부 콜에서는 동작하고 있었지만 콜에서는 동작하지 않고 흰색 라벨 오류 페이지가 반환되었습니다.

그래서 조사를 좀 해봤는데 그걸 알아냈어요

Spring은 발신자가 머신인지 아닌지를 파악하려고 하고, 그것이 JSON 응답을 반환하거나, 그것이 브라우저인 경우 흰색 라벨 오류 페이지 HTML을 반환합니다.

그 결과 클라이언트 앱은 REST 엔드포인트에 발신자가 브라우저가 아닌 머신임을 알려야 했습니다.이를 위해 클라이언트 앱은 resttemplate의 'put' 메서드에 대해 ACCEPT 헤더에 명시적으로 'application/json'을 추가해야 했습니다.저는 이것을 헤더에 추가하여 문제를 해결했습니다.

엔드포인트 호출:

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

위의 콜을 위해 아래 헤더 파라미터를 추가해야 했습니다.

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

또는 교환용으로도 바꾸려고 했는데, 이 경우 교환콜이 같은 헤더를 추가해서 문제를 해결했는데 왜 그런지 모르겠습니다.

restTemplate.exchange(....)

Geoand가 게시한 솔루션은 나에게 효과가 있습니다.또한 특정 페이지로 리디렉션하려면 이 페이지를 사용할 수 있습니다.

@RequestMapping(value = PATH)
public void error(HttpServletResponse response) {
    response.sendRedirect("/");   //provide your error page url or home url
}

아래 코드 전문:

@RestController
public class IndexController implements ErrorController{

    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public void error(HttpServletResponse response) {
         response.sendRedirect("/");   //provide your error page url or home url
    }

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

PS: 위의 답변은 편집할 수 없기 때문에 새로운 답변으로 게시합니다.

Spring Boot > 2.3.0의 JSON 형식의 커스텀에러 페이지

package com.example.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.error.ErrorAttributeOptions;
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.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@RestController
public class CustomErrorController implements ErrorController {
    private static final String PATH = "/error";

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(PATH)
    public Map<String, Object> error(WebRequest request, HttpServletResponse response) {
        return getErrorAttributes(request, true);
    }

    private Map<String, Object> getErrorAttributes(WebRequest request, boolean includeStackTrace) {
        ErrorAttributeOptions options = ErrorAttributeOptions.defaults()
                .including(ErrorAttributeOptions.Include.MESSAGE)
                .including(ErrorAttributeOptions.Include.EXCEPTION)
                .including(ErrorAttributeOptions.Include.BINDING_ERRORS);
        if(includeStackTrace){
            options = options.including(ErrorAttributeOptions.Include.STACK_TRACE);
        }
        return this.errorAttributes.getErrorAttributes(request, options);
    }
}

가장 좋은 옵션은 "error.html"이라는 이름의 HTML 페이지(JSP, THYMELEAP)를 작성하는 것입니다.이 페이지는 화이트리스트에 있는 모든 오류를 이 페이지로 리다이렉트 합니다.나중에 커스터마이즈할 수 있습니다.

Java Spring 부트에서는 화이트 라벨 오류를 쉽게 처리할 수 있습니다.구성 파일에 이 클래스를 추가합니다.

import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebRoutingConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/urlNotFound")
                // the viewName should be specified, in our case we forward to the index.html 
                .setViewName("forward:/index.html");
    }

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> containerCustomizer() {
        return container -> {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
                    "/urlNotFound"));
        };
    }

}

코드에 @RestController 주석을 추가하지 못했습니다.바보같이 들릴지 모르지만, 어딘가에 적어둘 가치가 있어요. 혹시라도 급하게 놓칠 때를 대비해서요.

@RestController
public class MyApiController implements MyApi {
.
.

언급URL : https://stackoverflow.com/questions/25356781/spring-boot-remove-whitelabel-error-page

반응형