@Programmatic public String recognize(Throwable ex) { List<Throwable> causalChain = Throwables.getCausalChain(ex); for (Throwable throwable : causalChain) { if(predicate.apply(throwable)) { if(logRecognizedExceptions) { LOG.info("Recognized exception, stacktrace : ", throwable); } if(ex instanceof TranslatableException) { final TranslatableException translatableException = (TranslatableException) ex; final TranslatableString translatableMessage = translatableException.getTranslatableMessage(); final String translationContext = translatableException.getTranslationContext(); if(translatableMessage != null && translationContext != null) { return translatableMessage.translate(translationService, translationContext); } } final Throwable rootCause = Throwables.getRootCause(throwable); final String rootCauseMessage = rootCause.getMessage(); final String parsedMessage = messageParser.apply(rootCauseMessage); return parsedMessage; } } return null; }