使用@EJB 注入时出现 NullpointerException
NullpointerException while injecting by using @EJB
我在使用 @EJB 注释注入我的 bean 时遇到问题 - bean 始终为空...
首先,这是我项目结构的相关部分。
ApplEAR.ear
|
├──WebModule.war (de.example.rest)
└──EJBModule.war (de.example.service)
所以...现在我正在尝试从我的 web 模块中的 ejb 模块注入一个 bean:
de.example.rest.RestBean:
@Stateless(name = "RestBean")
@Path("/restElements")
public class RestBean implements IRestBean {
@EJB
private UserBean userBean;
de.example.service.UserBean:
@Stateless(name = "UserBean")
@TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class UserBean{...
在我的 WebModule 中,我有这个 class 来扩展应用程序-class:
@ApplicationPath("/*")
public class RestApplication extends javax.ws.rs.core.Application {
/**
* {@inheritDoc}
*/
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(de.example.rest.RestBean.class);
return classes;
}
}
ear 部署在 websphere liberty 服务器上,安装了以下功能:
<feature>localConnector-1.0</feature>
<feature>appSecurity-3.0</feature>
<feature>beanValidation-2.0</feature>
<feature>ejbLite-3.2</feature>
<feature>ejbRemote-3.2</feature>
<feature>javaMail-1.6</feature>
<feature>jca-1.7</feature>
<feature>jdbc-4.2</feature>
<feature>jndi-1.0</feature>
<feature>jpaContainer-2.2</feature>
<feature>jsf-2.3</feature>
<feature>jsp-2.3</feature>
<feature>ldapRegistry-3.0</feature>
<feature>servlet-4.0</feature>
<feature>transportSecurity-1.0</feature>
<feature>websocket-1.1</feature>
<feature>jaxws-2.2</feature>
<feature>jaxrs-2.1</feature>
我尝试了不同的方法来解决我的问题:
在每个 WEB-INF/META-INF 文件夹中创建一个 beans.xml,
尝试使用 @LocalBean 和 @Local-interface - 并注入接口,
使用 @EJB(lookup = "java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean"),
改用@Inject。
在
的帮助下
InitialContext ctx = new InitialContext();
Object service = ctx.lookup(java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean);
我可以查找 bean,但使用注释会更容易。
那么我错过了什么或做错了什么?
我将不加解释地给出答案(因为我无法在 JAX-RS、规范等中描述 EJB 与 CDI 注入的所有细微差别)。
您可以通过从 RestBean 中删除 EJB 注释,将 UserBean 注入到 RestBean 中,并且添加 @Dependent
将其转换为 CDI-managed bean。
// ...
import javax.enterprise.context.Dependent;
//@Stateless(name = "RestBean")
@Path("/restElements")
@Dependent
public class RestBean implements IRestBean {
这假定您不需要使用 RestBean,比如说,作为远程 EJB,并且只将它用作 CDI-managed bean and/or JAX-RS 资源。
(注意:这假设您启用了 CDI 功能,您确实启用了,transitively/indirectly)。
我在使用 @EJB 注释注入我的 bean 时遇到问题 - bean 始终为空...
首先,这是我项目结构的相关部分。
ApplEAR.ear
|
├──WebModule.war (de.example.rest)
└──EJBModule.war (de.example.service)
所以...现在我正在尝试从我的 web 模块中的 ejb 模块注入一个 bean:
de.example.rest.RestBean:
@Stateless(name = "RestBean")
@Path("/restElements")
public class RestBean implements IRestBean {
@EJB
private UserBean userBean;
de.example.service.UserBean:
@Stateless(name = "UserBean")
@TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class UserBean{...
在我的 WebModule 中,我有这个 class 来扩展应用程序-class:
@ApplicationPath("/*")
public class RestApplication extends javax.ws.rs.core.Application {
/**
* {@inheritDoc}
*/
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(de.example.rest.RestBean.class);
return classes;
}
}
ear 部署在 websphere liberty 服务器上,安装了以下功能:
<feature>localConnector-1.0</feature>
<feature>appSecurity-3.0</feature>
<feature>beanValidation-2.0</feature>
<feature>ejbLite-3.2</feature>
<feature>ejbRemote-3.2</feature>
<feature>javaMail-1.6</feature>
<feature>jca-1.7</feature>
<feature>jdbc-4.2</feature>
<feature>jndi-1.0</feature>
<feature>jpaContainer-2.2</feature>
<feature>jsf-2.3</feature>
<feature>jsp-2.3</feature>
<feature>ldapRegistry-3.0</feature>
<feature>servlet-4.0</feature>
<feature>transportSecurity-1.0</feature>
<feature>websocket-1.1</feature>
<feature>jaxws-2.2</feature>
<feature>jaxrs-2.1</feature>
我尝试了不同的方法来解决我的问题: 在每个 WEB-INF/META-INF 文件夹中创建一个 beans.xml, 尝试使用 @LocalBean 和 @Local-interface - 并注入接口, 使用 @EJB(lookup = "java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean"), 改用@Inject。
在
的帮助下InitialContext ctx = new InitialContext();
Object service = ctx.lookup(java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean);
我可以查找 bean,但使用注释会更容易。
那么我错过了什么或做错了什么?
我将不加解释地给出答案(因为我无法在 JAX-RS、规范等中描述 EJB 与 CDI 注入的所有细微差别)。
您可以通过从 RestBean 中删除 EJB 注释,将 UserBean 注入到 RestBean 中,并且添加 @Dependent
将其转换为 CDI-managed bean。
// ...
import javax.enterprise.context.Dependent;
//@Stateless(name = "RestBean")
@Path("/restElements")
@Dependent
public class RestBean implements IRestBean {
这假定您不需要使用 RestBean,比如说,作为远程 EJB,并且只将它用作 CDI-managed bean and/or JAX-RS 资源。
(注意:这假设您启用了 CDI 功能,您确实启用了,transitively/indirectly)。