我認爲這些是無法恢復的業務限制brokens。
我目前的解決方案是異常層次結構。
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;
}
控制器代碼片段:
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
您可以使用@ExceptionHandler減少樣板的try-catch代碼,如果你的控制器組織得很好(但相當困難) 。
另一個原因使用Excepton是應用服務經常被用來劃定事務邊界。如果要回滾,必須拋出異常。
感謝,其他有趣的選擇可能是從MessageSource的地方異常唯一的消息代碼,並在以後檢索它(這個代碼)。 –