스프링 부트 화이트 라벨 삭제 오류 페이지
화이트 라벨 에러 페이지를 삭제하려고 하고 있기 때문에, 「/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을 하기 때문에 .BasicErrorController
Spring 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
'programing' 카테고리의 다른 글
Angular 지시어 템플릿에 조건부로 데이터 속성 추가 (0) | 2023.03.18 |
---|---|
패키지에 "홈 페이지"를 사용합니다.json, localhost 패스를 망치지 않고 (0) | 2023.03.18 |
AngularJS는 컨트롤러에서 형식이 유효한지 확인합니다. (0) | 2023.03.18 |
React 컴포넌트에 CSS와 스타일링을 적용하는 방법 (0) | 2023.03.18 |
파일 이름이 대/소문자가 같은 상대 경로에서 이미 포함된 파일 이름과 다릅니다. (0) | 2023.03.18 |