[ 
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)

Reply via email to