2014-10-25 4 views
0

RESTful 원칙에 따라 웹 서비스 API를 작성하고 있습니다. 서비스 계층에서 나는 다음과 같은 이름의 메소드를 가지고있다.REST-API에서 누락 된 ID에 대한 예외 예외 처리

/** 
* @param answerId Id of the answer that will be deleted. 
*/ 
void deleteAnswer(int answerId); 

대답의 id가 시스템에서 발견되면 예상대로 대답 할 것이다. 자, 내 질문은 :

는 웹 서비스에서이 엔드 포인트를 갖는 다음 API의

HTTP DELETE /my-context/answers/{answerId} 

사용자들이 원하는 ID를 추가 할 수 있습니다. 그들은해서는 안되지만 할 수는 있습니다. 그렇기 때문에 나는 HTTP 메시지를 해결하는 서비스 레이어에서 IllegalArgumentException을 던지고 싶다. (스프링 웹이 이것을 처리한다.) 내 다른 옵션은 true/false을 반환하도록 서비스 계층에서 deleteAnswer 메서드의 반환 형식을 변경하는 것입니다. 어떻게 생각해?

답변

0

true를 반환하면 HTTP 200을 반환한다는 것을 의미합니다. 404를 반환해야하지만 Spring에는 예외 처리기 컨트롤러가 있습니다. 사용자 정의 예외를 throw하고 적절한 오류 메시지와 함께 404를 보낼 예외 핸들러를 정의 할 수 있습니다.

0

예외를 반환하면 해당 mehod를 호출하는 데 오류가 있음을 의미합니다. true/false를 반환하면 서비스 API를 호출하는 것이 합법적이라는 뜻입니다. 당신은 "그들은해서는 안됩니다"라고 말했기 때문에 예외적으로 갈 것입니다.

나는 오히려 IllegalArgumentException보다 더 깨끗하게 처리 될 수있는 내 자신의 예외 클래스를 사용하려고합니다.

0

적절한 상태 코드를 지정하여 오류 신호를해야한다 귀하의 웹 서비스와 같은 400 또는 404
당신의 웹 서비스 서명이 다음 될 것입니다 : 당신은 서비스 계층에서 예외를 던질 수

ResponseEntity<Void> deleteAnswer(@PathVariable("answerId") int answerId); 

그것은 절대적으로 좋습니다.
그러면 'deleteAnswer'메소드에서이를 catch하고 적절한 상태 코드를 반환 할 수 있습니다.

또는 (더 나은), 당신은 당신이 서비스 계층에서 @ControllerAdvice과 예외를 사용하는 경우

@ControllerAdvice class YourExceptionResolver { 
    @ExceptionHandler 
    public ResponseEntity<String> defaultErrorHandler(HttpServletRequest req, Exception e) { 
     //return status code 400, 404, or 500 based on the exception 
     //with String containing the error message 
    } 
} 

, 당신은 원래 서명을 유지할 수 있습니다 사용하여 한 곳에서 모든 컨트롤러에서 모든 예외를 처리 할 수있는 '무효 deleteAnswer (int answerId) '를 호출합니다.