Прежде всего, вам не нужно использовать аннотацию @Local здесь.Это обозначает интерфейс как локальный интерфейс или при использовании в bean-компоненте (в вашем случае) может использоваться для указания на локальный интерфейс (через атрибут value).Ни один из случаев не применим здесь.Ваш код, как указано, также не будет компилироваться.lookup ("Foo") вернет объект, который должен быть приведен.
В любом случае, проблема EJB-контейнера не теряет никакой информации, но оборачивает ваше исключение в EJBException.Это потому, что FooException в конечном счете наследуется от RuntimeException.Любое такое исключение рассматривается контейнером как nonapplication exception
, и для тех, которые спецификация EJB определяет, что они должны быть заключены в оболочку.
В вашей ситуации вы уже вышли из EJBException, поэтому кажется, что это угловой случай,JBoss AS 6, например, в этой ситуации не выполняет дополнительного переноса, но, очевидно, OpenEJB делает.
Вы можете решить эту проблему, либо не допустив FooException наследовать от EJBException, либо перехватив исключение в своем тесте,распаковывая его и перебрасывая распакованное исключение.
Поскольку ваш метод bar объявляет, что он выдает FooException, я предполагаю, что вы не понимали, что EJBException является RuntimeException и, следовательно, исключением из приложения.Почему вы позволили FooException наследоваться от EJBException?Считаете ли вы, что это каким-то образом требуется, или для этого требуется сервер специального назначения?
(в качестве дополнительной подсказки убедитесь, что вы понимаете разницу между исключениями приложений и неаппликаций в отношении отката любой транзакции и уничтоженияобъединенный боб)