[ https://issues.apache.org/jira/browse/ARIES-1415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14902734#comment-14902734 ]
Christian Schneider commented on ARIES-1415: -------------------------------------------- Just committed a fix. Does that work for you? commit ffe34ef638d9c87de1d9131185706c5886dc20ff Author: cschneider <cschneider@13f79535-47bb-0310-9956-ffa450edef68> Date: Tue Sep 22 14:40:07 2015 +0000 [ARIES-1415] Do not wrap RuntimeException instances git-svn-id: https://svn.apache.org/repos/asf/aries/trunk@1704643 13f79535-47bb-0310-9956-ffa450edef68 > Exception laundering in JpaTemplate impls > ----------------------------------------- > > Key: ARIES-1415 > URL: https://issues.apache.org/jira/browse/ARIES-1415 > Project: Aries > Issue Type: Improvement > Components: JPA > Affects Versions: jpa-2.2.0 > Reporter: Matthew Pitts > > Currently XaJpaTemplate and ResourceLocalJpaTemplate wrap all caught > exceptions in a new RuntimeException and throw that instead of the original. > This can make it problematic to integrate with code that wants to run txExpr > methods and catch specific exceptions - like NoResultException or other type > of recoverable exception. > Perhaps a method (like launderTxException) could be added to their base class > - AbstractJpaTemplate - which could allow for additional exception laundering. > Specifically, I'm thinking of something that would actually attempt to > instantiate a new instance of the original exception type via reflection and > populate it with the necessary detail message. If it is unable to instantiate > the original exception, then it can simply rethrow it as-is or maintain the > original behavior of wrapping it in a RuntimeException. > Something like this: > {code} > protected RuntimeException launderTxException(Throwable original, String > message) { > if (RuntimeException.class.isInstance(original)) { > return wrapTxException(RuntimeException.class.cast(original), > message); > } > else { > return new RuntimeException(message, original); > } > } > protected RuntimeException wrapTxException(RuntimeException original, > String message) { > if (message == null) > return original; > try { > RuntimeException wrapper = original.getClass().getConstructor(new > Class[] > { String.class }).newInstance(message); > wrapper.initCause(original); > return wrapper; > } > catch (ReflectiveOperationException e) { > return original; > } > } > {code} > Thoughts, comments, criticisms? -- This message was sent by Atlassian JIRA (v6.3.4#6332)