将EJB注入Rest Exception Handler

时间:2015-11-12 13:06:45

标签: rest ejb tomee

我试图将本地@Stateless EJB注入Rest异常处理程序,但收到以下错误。

javax.naming.NameNotFoundException: Name [Test] is not bound in this Context. Unable to find [Test].

maven Web项目正在Apache-tomee-1.7.1-jaxrs上运行。

EJB:

@Stateless(name = "Test")
public class Test {

    public void sayHello() {
        System.out.println("Hello");
    }

}

异常处理程序,根据我的理解,我必须将其视为EJB的客户端。

@Provider
public class TestExceptionHandler implements ExceptionMapper<Throwable> {

    @Context
    HttpServletRequest request;

    @Override
    public Response toResponse(Throwable throwable) {

        InitialContext context;
        try {
            context = new InitialContext();
            Test test = (Test) context.lookup("Test");
            test.sayHello();

        } catch (NamingException ex) {
            ex.printStackTrace();
        }        


        return Response.ok().build();
    }    

}

我还尝试对查找执行以下操作:context.lookup("java:comp/env/Test");

http://openejb.apache.org/jndi-names.html文档很难理解。 还尝试了以下这是我的第一次尝试。 http://blog.iadvise.eu/2015/06/01/jee-using-ejb-and-context-annotations-in-a-jax-rs-provider-class/

我错过了tomee服务器或我的代码中的任何配置吗?

1 个答案:

答案 0 :(得分:0)

java:comp/env命名空间用于EJB 引用,而不是EJB。您尚未在任何地方声明EJB引用。

使用lookup("java:module/Test")直接查找EJB可能最容易(假设EJB打包在战争中,否则为java:app/ejbmodname/Test),因为默认情况下JAX-RS不支持EE注入。要声明EJB引用,您需要使提供者类成为EJB本身或CDI类(将beans.xml添加到模块中),然后将字段声明为@EJB(name="Test") Test myBean;