[ https://issues.apache.org/jira/browse/ARIES-1415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14902746#comment-14902746 ]
Matthew Pitts commented on ARIES-1415: -------------------------------------- Thanks for the commit. That is definitely helpful for exceptions thrown from the body of the EmConsumer/EmFunction. However, I was also looking at XaJpaTemplate:73 where it wraps exceptions caught during actual TX commit as RuntimeExceptions. Would this be a logical place to also perform the RuntimeException check? If so, the custom exception message would be lost if you just re-throw the original exception. Also, should ResourceLocalJpaTemplate be updated to use wrapException as well? > 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)