2011-04-22 2 views
8

Spring MVC를 사용하여 일부 서블릿을 Spring 프레임 워크로 마이그레이션하려고합니다. 현재 각 서블릿에서 우리는 사용자를 인증하고 인증은 우리가 할 실패했을 경우Spring 컨트롤러 나 서비스에서 에러와 메시지 리턴하기

프런트 엔드에
if (authfailed) 
{ 
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, 
        "You are not authorized."); 
    return; 
} 

는 YUI 기반 응용 프로그램이며, 오류 상태가 반환 된 경우 "실패"콜백 대화 상자가 표시됩니다를 위에 주어진 오류 메시지와 함께.

컨트롤러에서 응답 객체를 가져올 수 있고 sendError이라고 부를 수는 있지만이를 처리하는 가장 좋은 방법은 무엇입니까? sendError도 IOException을 던져서 모든 컨트롤러의 모든 메서드에 삽입하는 성가신 코드를 잡아야합니다.

서블릿에는 catch 메소드에서 sendError을 호출하는 try-catch 블록이 있습니다. 나는

@ExceptionHandler 
@ResponseStatus(value = HttpStatus.NOT_FOUND) 

내 예외 핸들러를 표시 할 수 있습니다 알고 있지만 예외 처리 클래스는 각각의 컨트롤러 클래스에있을 필요가 없다?

마지막으로 컨트롤러에서 호출 된 서비스에서 예외가 발생하면 컨트롤러에서 예외가 발생합니까? 아니면 서비스에서 예외를 처리해야합니까? (따라서 이러한 예외 처리 문제가 서비스 계층으로 푸시됩니다)?

이것은 더 어려워 보이지만, 봄의 많은 것들과 마찬가지로 나는 무슨 일이 일어나고 있는지 이해할 수 없을 것입니다. 내가하고 싶은 것은 응답에 에러 상태와 메시지를 되돌려 보내는 것뿐입니다!

감사합니다,

바울은

답변

16

당신이 질문 자체 :)

가 반복하여 답변의 대부분을이처럼 보이는,

같은 컨트롤러가
@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request) throws NotFoundException { 
    String id = request.getParameter("id"); 

    if (id == null) 
     throw new NotFoundException("Id not found in the request"); 

    return "success"; 
} 

NotFoundException.java에서 예외 클래스를 선언하십시오. ,

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Id Not Found") 
public class NotFoundException extends Exception { 

    public NotFoundException(String msg) { 
     super(msg); 
    } 
} 

이 예외 클래스는 모든 컨트롤러 클래스 일 필요는 없습니다. 그것을 공용 클래스로 선언하고 필요한 모든 컨트롤러에서 가져옵니다.

이렇게하는 방법 중 하나입니다. 당신이 아닌 봄 스타일을 좋아한다면, 당신의 viewResolver가 올바르게 구성되어

@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request, Map<String, Object> map){ 
    String id = request.getParameter("id"); 

    if (id == null) { 
     map.put("status", HttpStatus.NOTFOUND); 
     map.put("reason", "Id Not Found"); 

     return "error" 
    } 
     return "success"; 
} 

이 있는지 확인하십시오, 모든 컨트롤러 인수 HttpServletResponse를 선언하고

@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request, HttpServletResponse response) { 
    ... 
    try { 
    response.sendError(..) 
    catch(..) {} 
} 

을 또는 오류 메시지를 표시하는 뷰를 사용할 수 있습니다 error.jsp를 사용하여 오류 문자열을 얻으십시오.

<body> 
${status} ${reason} 
</body> 

예상되는 모든 종류의 오류에 대해 좋은 CSS로 error.jsp를 정의하십시오. 이것은 유일한 방법은 아닙니다. 봄에는 무엇이든 할 수있는 자유가 있습니다.오류 메시지에 대한 몇 가지 ppl 렌더링 json 개체를 본 적이 있습니다.

컨트롤러가 호출하는 서비스에서 오류가 발생하는지에 대한 또 다른 질문은 시나리오에 따라 달라집니다. 예를 들어 사용자 저장소를 읽으려고하면 사용자 저장소를 사용할 수 없다는 오류가 발생하면 다른 복제본 사용자 저장소에서 사용할 수있는 경우 해당 저장소를 읽을 수 있도록 처리합니다. 사용자가 존재하지 않는다면 예외를 컨트롤러를 던지십시오.

+3

감사합니다. 문제를 너무 망설였습니다. 때로는 내가 봄과 함께 일할 때 일어난다. 나는 내 머리 속에서 너무 많은 아이디어를 얻었고 그것들을 분류 할 수 없다. – Paul

관련 문제