2013-08-05 5 views
0

저는 스프링 MVC를 기반으로 웹 응용 프로그램을 구현하고 DDD 개념을 중심으로 구성했습니다. 현재 티켓 예약 기능을 구현하려고합니다. 고객은 특정 이벤트에 사용할 수있는 티켓 수를 볼 수 있습니다. 그런 다음 예약 할 항공권 수를 입력하고 양식을 제출할 수 있습니다. 등록을 책임지는 응용 서비스를 호출하는 컨트롤러가 요청을 수신합니다.응용 프로그램 서비스 계층의 오류보고

  1. 검증 입력 매개 변수 :
    • (1A)를 다음과 같이 응용 프로그램 서비스 로직이다. 해당 ID의 이벤트가 존재하는지 확인하십시오.
    • 1B. 사용 가능한 티켓 수가 예약 가능한지 확인하십시오.
  2. 유효성 검사가 통과되면 등록을 진행하십시오. 그렇지 않으면 오류를보고하십시오.

유효성 오류를보고하기위한 적절한 방법, 특히 포인트 1B에 대한 몇 가지 의구심이 있습니다. 항공권의 수가 예약을 허용하지 않는 상황은 매우 이례적인 것이 아닙니다. 고객은 데이터베이스의 현재 티켓 수와 완전히 일치하지 않는 티켓 수를 볼 수 있습니다 (궁극적으로 일관성 있음). 그 사이 다른 사람이 일부 티켓을 예약 할 수 있습니다.

처음에는 몇 가지 예외를 던져서이 문제를보고하려고 생각했습니다. 그러나, 나는 다른 문제 상황의 몇 가지 생각할 수 있고 그들 각각에 대한 하나의 예외가 아주 잘 들리지 않는 데.

다른 옵션은 오류 코드가 포함 된 한 가지 유형의 예외를 throw하는 것입니다. 그러나 Spring MVC에서이 상황을 적절히 처리하는 방법을 알지 못한다.

이러한 문제의 모범 사례는 무엇입니까? MVC 응용 프로그램에서 어떻게 처리합니까? 모든 조언 크게 감사드립니다.

답변

1

이러한 것들은 복구 할 수없는 비즈니스 제약 브로큰이라고 생각합니다.

현재 해결 방법은 예외 hierachy입니다.

public abstract class UncheckedApplicationException extends RuntimeException { 

    //omitted factory methods and constructors 
    public abstract String getStatusCode(); 

    public abstract String getI18nCode();//ignore this if you don't need i18n  

    public abstract String[] getI18nArgs();//ignore this if you don't need i18n 
} 

모든 사용자 지정 예외는이 예외를 확장합니다. 나는이 같은 코드를 피할 수 있다고 생각 :

try { 
    //invoke your application service 
} catch (InsufficientInventoryException e) { 
    statusCode = INSUFFICIENT_INVENTORY; 
} catch (ExpriedPriceException e) { 
    statusCode = EXPIRED_PRICE; 
} catch (NoSuchProductException e) { 
    statusCode = NO_SUCH_PRODUCT; 
} catch (Exception e) { 
    statusCode = UNKNOWN; 
} 

컨트롤러 코드 :

컨트롤러가 잘 조직되어있는 경우는 보일러 시도-catch 코드를 줄이기 위해 @ExceptionHandler을 사용할 수 있습니다
try { 
    //invoke your application service here 
    statusCode = SUCCESS; 
    message = messageSource.getSuccess(locale)); 
} catch (UncheckedApplicationException e) { 
    statusCode = e.getStatusCode(); 
    message = messageSource.getMessage(e, locale)); 
} catch (Exception e) { 
    statusCode = UNKNOWN; 
    message = messageSource.getUnknownError(e, locale)); 
} 
//add statusCode & message to modelAttribute 

(하지만 꽤 어렵다) .

Excepton을 사용하는 또 다른 이유는 응용 프로그램 서비스가 종종 트랜잭션 경계를 구분하는 데 사용된다는 것입니다. 롤백하려는 경우 예외가 발생해야합니다.

+0

다른 흥미로운 옵션은 메시지 코드 만 예외로두고 나중에이 코드로 MessageSource에서 검색하는 것입니다. –

관련 문제