我试图将本地@Stateless
EJB注入Rest异常处理程序,但出现以下错误。
javax.naming.NameNotFoundException: Name [Test] is not bound in this Context. Unable to find [Test].
maven Web项目正在Apache-tome-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服务器或代码中是否缺少任何配置?
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;
。