[SPRING] Spring MVC : 맞춤 404 오류 페이지를 반환하는 방법?
SPRINGSpring MVC : 맞춤 404 오류 페이지를 반환하는 방법?
내가 요청한 리소스를 찾을 수 없을 때 봄 4 맞춤 404 오류 페이지를 반환하는 깨끗한 방법을 찾고 있어요. 다른 도메인 유형에 대한 조회는 다른 오류 페이지를 야기합니다.
여기 내 의도를 보여주는 몇 가지 코드 (Meter는 도메인 클래스 임) :
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model) {
final Meter result = meterService.findOne(number);
if (result == null) {
// here some code to return an errorpage
}
model.addAttribute("meter", result);
return "meters/details";
}
나는이 문제를 다루는 몇 가지 방법을 상상한다. 먼저 RuntimeExceptions를 생성 할 가능성이 있습니다.
@ResponseStatus(HttpStatus.NOT_FOUND)
public class MeterNotFoundExcption extends RuntimeException { }
그런 다음 예외 처리기를 사용하여 사용자 정의 오류 페이지를 렌더링합니다 (아마도 미터 목록이나 적절한 항목에 대한 링크가 포함될 수 있습니다).
하지만 나는 작은 예외를 제외하고는 내 응용 프로그램을 오염시키는 것을 좋아하지 않습니다.
또 다른 가능성은 HttpServletResponse를 사용하고 상태 코드를 수동으로 설정하는 것입니다.
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model,
final HttpServletResponse response) {
final Meter meter = meterService.findOne(number);
if (meter == null) {
response.setStatus(HttpStatus.NOT_FOUND.value());
return "meters/notfound";
}
model.addAttribute("meter", meter);
return "meters/details";
}
하지만이 솔루션을 사용하면 많은 컨트롤러 메소드 (편집, 삭제 등)의 처음 5 행을 복제해야합니다.
이 줄을 여러 번 복제하지 못하게하는 우아한 방법이 있습니까?
해결법
-
==============================
1.해결책은 생각보다 훨씬 간단합니다. 다음과 같이 정의 된 하나의 일반 ResourceNotFoundException을 사용할 수 있습니다.
해결책은 생각보다 훨씬 간단합니다. 다음과 같이 정의 된 하나의 일반 ResourceNotFoundException을 사용할 수 있습니다.
public class ResourceNotFoundException extends RuntimeException { }
ExceptionHandler 어노테이션을 사용하여 모든 컨트롤러 내에서 오류를 처리 할 수 있습니다.
class MeterController { // ... @ExceptionHandler(ResourceNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handleResourceNotFoundException() { return "meters/notfound"; } // ... @RequestMapping(value = "/{number}/edit", method = RequestMethod.GET) public String viewEdit(@PathVariable("number") final Meter meter, final Model model) { if (meter == null) throw new ResourceNotFoundException(); model.addAttribute("meter", meter); return "meters/edit"; } }
모든 컨트롤러는 ResourceNotFoundException에 대해 자체 ExceptionHandler를 정의 할 수 있습니다.
-
==============================
2.web.xml 파일을 수정했습니다. 다음 코드를 사용하십시오.
web.xml 파일을 수정했습니다. 다음 코드를 사용하십시오.
<display-name>App Name </display-name> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page>
다음 코드에 따라 액세스하십시오.
response.sendError(508802,"Error Message");
이제이 코드를 web.xml에 추가하십시오.
<error-page> <error-code>508802</error-code> <location>/error500.jsp</location> </error-page>
-
==============================
3.web.xml의 오류 코드는 다음과 같이 매핑 할 수 있습니다.
web.xml의 오류 코드는 다음과 같이 매핑 할 수 있습니다.
<error-page> <error-code>400</error-code> <location>/400</location> </error-page> <error-page> <error-code>404</error-code> <location>/404</location> </error-page> <error-page> <error-code>500</error-code> <location>/500</location> </error-page>
이제 이러한 오류가 발견 될 때 적중 된 URL을 매핑하는 컨트롤러를 만들 수 있습니다.
@Controller public class HTTPErrorHandler{ String path = "/error"; @RequestMapping(value="/404") public String error404(){ // DO stuff here return path+"/404"; } }
전체 예제는이 튜토리얼을 참조하십시오.
-
==============================
4.Spring MVC 프로젝트에서 예외 처리에 대한 자세한 정보를 찾을 수있는이 기사를 따라야한다.
Spring MVC 프로젝트에서 예외 처리에 대한 자세한 정보를 찾을 수있는이 기사를 따라야한다.
봄 - mvc - 예외 처리
이 경우 @ControllerAdvice가 도움이 될 수 있습니다.
-
==============================
5.web.xml 파일에 다음 코드 행을 추가하고 프로젝트의 루트 디렉토리에 errorPage.jsp라는 새 jsp 파일을 도입하여 요구 사항을 완료 할 수 있습니다.
web.xml 파일에 다음 코드 행을 추가하고 프로젝트의 루트 디렉토리에 errorPage.jsp라는 새 jsp 파일을 도입하여 요구 사항을 완료 할 수 있습니다.
<error-page> <error-code>400</error-code> <location>/errorPage.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/errorPage.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/errorPage.jsp</location> </error-page>
-
==============================
6.100 % 무료 xml에 대한 간단한 대답 :
100 % 무료 xml에 대한 간단한 대답 :
그게 다야.
-
==============================
7.org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer도 사용하지 않아야했습니다.
org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer도 사용하지 않아야했습니다.
org.springframework.web.servlet.DispatcherServlet.setThrowExceptionIfNoHandlerFound (boolean)에 따르면 : "DefaultServletHttpRequestHandler가 사용되면 요청은 항상 기본 서블릿으로 전달되며이 경우 NoHandlerFoundException은 절대로 발생하지 않습니다."
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html#setThrowExceptionIfNoHandlerFound-boolean-
전에
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.foo.web") public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } // ... }
후
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.foo.web") public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { } // ... }
from https://stackoverflow.com/questions/21061638/spring-mvc-how-to-return-custom-404-errorpages by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Service 주석은 어디에 보관해야합니까? 인터페이스 또는 구현? (0) | 2018.12.15 |
---|---|
[SPRING] MockMvc를 사용하여 스프링 컨트롤러 메소드를 테스트하는 방법은 무엇입니까? (0) | 2018.12.15 |
[SPRING] 스프링 부트의 핫 스와핑 (0) | 2018.12.15 |
[SPRING] 스프링 웹, 보안 + web.xml + mvc 디스패처 + Bean이 두 번 생성됨 (0) | 2018.12.15 |
[SPRING] OAuth2 인증 서버 / 사용자 엔드 포인트에서 맞춤 사용자 정보를 얻는 방법 (0) | 2018.12.14 |