Petras created OPENEJB-2111:
-------------------------------
Summary: Unchecked application exceptions, thrown in asynchronous
business methods, are always wrapped in EJBException
Key: OPENEJB-2111
URL: https://issues.apache.org/jira/browse/OPENEJB-2111
Project: OpenEJB
Issue Type: Bug
Components: ejb31, tomee
Affects Versions: 4.7.1
Reporter: Petras
Example of my business method:
{code}
@Asynchronous
public Future<AttachmentWBean> convertToPDF(File file, String contentType)
throws FileConverterException, OperationCancelledException {
final ConversionResultWBean wsResult = invokeFileConverterWS(file,
contentType);
return new AsyncResult<>(wsResult.getResultFile());
}
{code}
FileConverterException is checked exception while OperationCancelledException
class is unchecked and declared as ApplicationException:
{code}
@ApplicationException
public class OperationCancelledException extends RuntimeException {
//...
}
{code}
The reason is that
{{org.apache.openejb.async.AsynchronousPool.FutureAdapter#handleException}}
method does not check whether exception is an unchecked ApplicationException
and always wrapps it into EJBException. Only checked exceptions are returned
directly:
{code}
private void handleException(Throwable e) throws ExecutionException {
//unwarp the exception to find the root cause
while (e.getCause() != null) {
e = e.getCause();
}
/*
* StatefulContainer.obtainInstance(Object, ThreadContext, Method)
* will return NoSuchObjectException instead of NoSuchEJBException
*
* when it can't obtain an instance. Actually, the async client
* is expecting a NoSuchEJBException. Wrap it here as a workaround.
*/
if (e instanceof NoSuchObjectException) {
e = new NoSuchEJBException(e.getMessage(), (Exception) e);
}
final boolean isExceptionUnchecked = e instanceof Error || e instanceof
RuntimeException;
// throw checked excpetion and EJBException directly.
if (!isExceptionUnchecked || e instanceof EJBException) {
throw new ExecutionException(e);
}
// wrap unchecked exception with EJBException before throwing.
throw e instanceof Exception ? new ExecutionException(new
EJBException((Exception) e))
: new ExecutionException(new EJBException(new Exception(e)));
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)