2011-02-13 3 views
2

이 질문은 예외로 간주되지만 제 예제를 사용하겠습니다.봄 예외 메시지? 이게 뭐야?

성공적인 로그인 후 "사용자 홈"페이지에 대해 다음과 같은 간단한 컨트롤러가 있습니다. 세션이 존재하지 않을 때

@Controller 
@RequestMapping("/user-home") 
public class UserHomeController { 

    private static Log log = LogFactory.getLog(UserHomeController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String getUserHome(HttpServletRequest request) { 

     if (request.getSession(false) == null) { 
      throw new UnauthorizedClientException("Could not authenticate request. There is no session present for this request."); 
     } else { 
      return "user_home"; 
     } 
    } 

    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ExceptionHandler({UnauthorizedClientException.class}) 
    public void handle404() { 
     log.info("An UnauthorizedClientException was thrown inside UserHomeController."); 
    } 
} 

그래서, 작동, 즉 I는 기본 404 페이지를 얻을 수 있지만, 나는 UnauthorizedClientException에 전달 된 메시지는 아무데도 찾을 수 있습니다. 404 페이지의 뒤에는 "Message :"가 표시됩니다.

내 메시지는 어디로 갔습니까? 일반적으로 예외의 생성자에 전달되는 메시지의 목적은 무엇입니까?

+0

무슨 메시지가 당신을 언급하고 있습니까? 페이지에서 볼 수있는 메시지는 무엇입니까? – skaffman

+0

UnauthorizedClientException (String msg)입니다. 나는 확실하지 않다! 난 그 예외의 생성자에서 메시지가 무엇을위한 것인지 궁금하다. –

+0

Regular Java Exception의 생성자 args에 "msg"가 있으며 그 목적에 대해 항상 혼란스러워합니다. 이 특별한 경우에는 404 페이지에서 끝날 것이라고 가정했지만 그렇지 않았습니다. –

답변

4

UnauthorizedClientException에 대한 오해가 있습니다. 페이지를 렌더링하는 것이 아니라 내부 제어 흐름을위한 것입니다.

예외를 throw 할 때 Spring은이를 캐치하여 handle404() 메소드에 전달합니다. 이 메서드는 차례대로 예외 처리를 담당합니다.

@ExceptionHandler -annotated 메서드는 거의 모든면에서 @RequestMapping 메서드와 비슷하게 동작합니다. 그것은 유용한 일이 생길 경우, 견해와 모델을 돌려줘야한다는 것을 의미합니다.

그러나 모든 메소드는 예외 메시지를 내부 로거에 로깅 한 다음 리턴합니다. 뷰를 반환하지 않으므로 기본 오류 페이지가 예외로 렌더링되지 않습니다. 모델을 반환하지 않으므로 메시지가 표시되지 않습니다.

handle404() 메서드를 (a) 렌더링 할 JSP 이름을 반환하고 (b) 해당 메시지를 모델에 추가해야합니다.

+0

좋아요,하지만 제가보기 엔 돌아 오지 않으면 제가 한 것처럼 어떻게됩니까? 나는 @ResponseStatus (HttpStatus.NOT_FOUND)가 특별한 것을 할 것이라고 가정하고 있었다. –

+0

@ 토니 : 100 % 확신 할 수는 없지만, 그냥 컨테이너에 남겨 두었다고 생각합니다. 그러면 기본 404 페이지에서 일반적인 정보를 뺀 것입니다 (컨트롤 흐름을 "납치"했기 때문에 거기에 있지 않습니다) . – skaffman

0
@ResponseStatus(HttpStatus.NOT_FOUND) 
@ExceptionHandler({UnauthorizedClientException.class}) 
public void handle404() { 

그렇다면 핸들러가 호출되지 않는 404 및 다른 예외 클래스가 있다면? @ExceptionHandler 특수 효과를 삭제하면 어떻게 될까요?

이 변경 후에 처리기가 호출되는 경우 다른 대가로 404를 얻는다고 나에게 제안합니다.

+0

주석을 제거 했으므로 예외가 단순히 잡히지 않습니다. 사실 여기에 표시하는 것보다 많은 로그 메시지가 있습니다. 그리고 내가 본 것처럼 흐름이 진행되고 있음을 확신합니다. –

1

어때?

@ExceptionHandler(UnauthorizedClientException.class) 
public ModelAndView handle404(UnauthorizedClientException exception) { 
    ModelAndView modelAndView = new ModelAndView("/errors/404"); 
    modelAndView.addObject("message", exception.getMessage()); 
    return modelAndView; 
} 

이렇게하면 예외에서 메시지를 설정하고 멋지게 서식이 지정된 404 오류 페이지에 표시 할 수 있습니다.

+0

감사합니다. 이것은 사용자 정의 404에 메시지를 수동으로 표시하는 좋은 해결책을 제공합니다. +1 –

관련 문제