요청한 리소스를 찾을 수없는 경우 Spring 4에서 맞춤 404 오류 페이지를 반환하는 깨끗한 방법을 찾고 있습니다. 다른 도메인 유형에 대한 조회는 다른 오류 페이지를 야기합니다. 여기 스프링 MVC : 맞춤 404 오류 페이지를 반환하는 방법은 무엇입니까?
내 의도를 보여주는 몇 가지 코드 (미터는 도메인 클래스) :@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";
}
내가 문제를 처리하기위한 몇 가지 방법을 상상한다. 먼저 가능성이
@ResponseStatus(HttpStatus.NOT_FOUND)
public class MeterNotFoundExcption extends RuntimeException { }
같은 RuntimeException
의를 만든 다음 (어쩌면 미터의 목록 또는 어떤 적절한에 대한 링크를 포함) 사용자 정의의 errorpage을 렌더링하기 위해 예외 핸들러를 사용할 수있을 것입니다.
그러나 나는 작은 예외를 제외하고 내 응용 프로그램을 오염시키는 것을 좋아하지 않습니다.
또 다른 가능성은 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 개 행을 복제해야합니다.
이 줄을 여러 번 복제하지 못하게하는 우아한 방법이 있습니까?
어, 아니. 컨트롤러 내에서 이러한 예외 처리를하면'meter '가 발견되지 않을 때의 HTTP 상태는 여전히'404'가 아니라'200'이되기 때문에 실제로 의도 한대로 작동하지 않습니다. 실제로 사용자에게 멋진 페이지를 보여 주지만 브라우저는 요청이 성공적으로 처리되었음을 나타내는 응답을 수신합니다. –
힌트를 보내 주셔서 감사합니다. 방금 코드를 다시 확인 했으므로 옳습니다. 'ResponseStatus' 주석은 예외 처리기로 가야합니다. 나는 대답을 고쳤다. –