Как обрабатывать бизнес-исключения из уровня обслуживания в стойках 2 только в одном месте
Я работаю с приложением, включающим Struts2 на веб-уровне и Spring на бизнес-уровне. У меня также есть класс BusinessException, который будет использоваться всеми бизнес-сервисами для создания связанных с бизнесом сбоев валидации, которые должны доходить до веб-уровня и должны отображаться пользователям в качестве сообщения (й) валидации. Я легко могу сделать это, написав в своем классе действий:
ClientAction extends ActionSupport throws Exception{
....
try{
clientService.searchClient();
}catch(InvalidClientSearchCriteriaException e){
addActionMessage("Invlid Search Criteria");
}
...
И подобный код в каждом классе действий. Однако я не хочу загрязнять свои уроки действия блокировками try catch. Вместо этого было бы намного лучше, если бы я мог написать блок try catch в одном месте и перехватить все исключения там как BusinessExceptions и создать сообщения / ошибки из встроенных сообщений / ошибок в этих исключениях. Один из подходов, который я мог придумать, состоял в том, чтобы использовать перехватчик или прослушиватель preresult. Но я не могу использовать перехватчик, как показано ниже, который ловит BusinessExceptions, выброшенных из классов действий...
ExceptionInterceptor extends AbstractInterceptor(ActionInvocation ivocation,...){
try{
invocation.invoke();
}catch(Exception e){
if(e instanceof BusinessException){
ActionSupport as = (ActionSupport)invocation.getAction();
String message = extractMessagefromException()//--custom method to extract message embedded in exception.
as.addActionMessages(message);
//-- above will not work result has already been rendered right? and hence it wouldn't matter if i add action messages now.
}
}
}
Второй подход использования прослушивателя с предварительным результатом заключается в добавлении сообщений действия, как описано выше, в методе прослушивателя с предварительным результатом, так как результат еще предстоит отобразить, и я могу смело его изменить. Однако я не уверен, будет ли когда-либо выполняться прослушиватель с предварительным результатом, если исключение выдается в действии? И даже если это произойдет, как я могу получить объект исключения, брошенный действием?
Пожалуйста, дайте мне знать любой другой подход, при котором мне не нужно загромождать свои занятия блоком try-catch