- Arawn's Dev Blog
- Outsider's Dev Story
- Toby's Epril
- Benelog
- NHN 개발자 블로그
- SK 플래닛 기술 블로그
- OLC CENTER
- 소프트웨어 경영/공학 블로그
- 모바일 컨버전스
- KOSR - Korea Operating System …
- 넥스트리 블로그
- 리버스코어 ReverseCore
- SLiPP
- 개발자를 위하여... (Nextree 임병인 수석)
- "트위터 부트스트랩: 디자이너도 놀라워할 매끈하고 직관…
- Learning English - The English…
- real-english.com
- 'DataScience/Deep Learning' 카테…
- Deep Learning Summer School, M…
- Deep Learning Courses
민서네집
Spring 에서 404 error page를 Thymeleaf로 처리하기. 본문
HTTP 404 error 페이지를 Custom하게 바꾸고 싶었다.
다음과 같이 spring에서 SimpleMappingExceptionResolver 로 Exception을 처리하도록 해도 404 에러는 이것을 통해 처리되지 않는다.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/exception/resourceNotFound.html</location>
</error-page>
java 파일에서 web.xml에서 설정한 location 값으로 Controller에 request mapping을 다음과 같이 설정해 준다.
/**
* Exception Homepage
*/
@Controller
public class ExceptionController {
/**
* web.xml 에서 정의한 404 error 페이지의 Handler.
* 이렇게 하면 Thymeleaf Library를 통해서 처리된다.
* @return
*/
@RequestMapping("/exception/resourceNotFound.html")
@ResponseStatus(value=HttpStatus.NOT_FOUND)
public String resourceNotFound() {
return "exception/resourceNotFound";
}
}
Controller 에 다음과 같이 Parameter를 받는 Request Mapping Hander를 추가했는데, 역시나 spring 의 SimpleMappingExceptionResolver 에서는 처리하지 못했다. (Parameter 로 "number" 를 넘겨줘야 하는데, request에서 이 파라미터를 넘겨주지 않을 경우 HTTP 400 Error가 발생한다.)
@RequestMapping("/test")
public String test(@RequestParam(value="number") Long number) {
System.out.println("test..." + number);
return "exception/error";
}
HTTP Status 400번 Error Page도 Customize 하기 위해서는
web.xml 에서
<!-- Error pages -->
<error-page>
<error-code>404</error-code>
<location>/exception/resourceNotFound.html</location>
</error-page>
<error-page>
<location>/exception/error.html</location>
</error-page>
위와 같이 404 error-code 의 <error-page> 다음에 <error-page> 태그를 추가해야 한다.
그런데 Controller 안에서 에러 코드를 알 수 있는 방법이 없을까?
에러 코드마다 View를 따로 만들어 줄 것이 아니라면 Controller 안에서 에러 코드를 알 수 있는 방법이 있어야 할 것 같다.
@RequestMapping("/exception/error.html")
public String error(Model model, HttpServletResponse response) {
model.addAttribute("response", response );
return "exception/error";
}
error.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Error Page</title>
<link rel="stylesheet" th:href="@{/css/main.css}" type="text/css" />
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body class="error">
<h1 th:text="${'Error Code: ' + response.status}">Error Code: 400</h1>
<a href="index" th:href="@{/index}">Back to Main Page</a>
</body>
</html>
404 에러의 경우, errorMessage 에 아무 것도 출력 안되기 때문에
<!-- Error pages -->
<error-page>
<error-code>404</error-code>
<location>/exception/resourceNotFound.html</location>
</error-page>
<error-page>
<location>/error</location>
</error-page>
이렇게 에러 코드를 404로 분리해 놓는게 좋을 것 같다.
400번 에러도 아무 것도 찍히지 않는 것은 마찬가지다.
ServletRequest Interface의 getAttributeNames() 메서드로 loop 돌면서 에러 메시지가 담겨 있는 Attribute가 있는지 찾아볼 수도 있겠다.
일부러 Runtime Exception을 발생시켜 보면... 아래처럼 보인다.
/** Simulation of an exception. */
@RequestMapping("/simulateError")
public void simulateError() {
throw new RuntimeException("This is a simulated error message");
}
'Spring' 카테고리의 다른 글
Spring Security 3.2 (0) | 2015.03.26 |
---|---|
[Spring Framework] JsonView 설정과 Spring 4.1에서 406 Error 대처법 (4) | 2015.03.26 |
Invocation of destroy method 'close' failed on bean with name 'sqlSessionTemplate' (0) | 2014.12.23 |
스프링에서 SQL 로그 사용하기 (log4jdbc,log4sql) (0) | 2014.12.11 |
인터넷에 연결 안되면 Spring Framework 에러 발생. (2) | 2014.09.04 |