Наконец, основываясь на предыдущем ответе и моих личных исследованиях, я сохранил следующее решение.
Я создал перехватчик, предназначенный для управления ошибками сервера:
public class FaultBarrierInterceptor {
@AroundInvoke
public Object intercept(final InvocationContext invocationContext) throws Exception {
try {
return invocationContext.proceed();
} catch (final RuntimeException e) {
final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass());
logger.error("A fault occured during service invocation:" +
"\n-METHOD: " + invocationContext.getMethod() +
"\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e);
throw new TechnicalException();
}
}}
Созданное техническое исключение расширяет EJBException и не раскрывает причину. RuntimeException:
public class TechnicalException extends EJBException {}
Я использую этот перехватчик во всех государственных службах:
@Stateless
@Interceptors({FaultBarrierInterceptor.class})
public class ShoppingCardServicesBean implements ShoppingCardServices { ...
Это реализация шаблона Fault Barrier .
Любое исключение во время выполнения перехватывается, регистрируется, и клиенту сообщается об ошибке (без внутренних подробностей) с использованием TechnicalException. Проверенные исключения игнорируются.
Обработка RuntimeException централизована и отделена от любых бизнес-методов.