嗨@All :)我这里有一个奇怪的问题。我想在UserBean
的类中注入@EJB(beanName="user")
被管实体。如果我不使用beanName
属性,则会收到以下错误消息:
org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name null
如果我这样使用它@EJB(beanName="user") UserBean user;
我就明白了:
org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name user
我做错了什么?
以下是UserBean
以及我如何注入它:
的UserBean
// removed imports
@ManagedBean(name="user")
@Local
@SessionScoped
@Entity
@Table(name="t_user")
public class UserBean implements Serializable, UserInterface{
// fields (@Columns, etc.)
// setters / getters
}
UserBeanUser
// more removed imports
@ManagedBean(name="userUsed")
@Stateful
@Local
public class UserOfUserBean implements Serializable, Userable {
private @EJB(beanName="user") UserBean user;
}
接口为空,标记为@Local
。
答案 0 :(得分:3)
对不起,但是在很多层面上这是错误的,很难从哪里开始。
首先,@Local
注释对您显示的代码没用。它用于将接口标记为EJB的业务接口,或指向此类接口。
然后,实体UserBean
可能不应该是作用域和托管bean。这些注释用于让bean容器管理bean的生命周期,但是在实体的情况下,它是负责该实体的实体管理器。
目前尚不清楚您是否在此使用了JSF或Java EE ManagedBean
注释,但后者从不需要,并且根据上述说明不应该需要第一个注释。
此外,根据典型约定,请考虑仅为User
命名实体,并且不要让它实现接口。
UserOfUserBean
甚至更难破译。这个bean应该是业务服务还是(JSF)支持bean?如果它是一个支持bean,则不需要@Stateful
注释,否则您不需要@ManagedBean
注释。
然后,你问题的主要罪魁祸首:@EJB注释不能注入非EJB bean。 JPA实体(@Entity
)和JSF托管bean(@javax.faces.bean.ManagedBean
)不是EJB bean。
此外,beanName
的@EJB
属性不与name
中的@ManagedBean
属性相对应。如果接口由多个bean实现并且与JSF托管bean名称或Java EE托管bean名称无关,则bean名称是EJB内部事物,用于消除注入的歧义。 (不适用于您的问题,但CDI的@Named
和JSF的托管bean名称之间存在关联)
最后,实体和支持bean需要标记为@Local
的空接口。
因此,您的实体应该变成:
@Entity
@Table(name="t_user")
public class User implements Serializable {
// fields (@Columns, etc.)
// setters / getters
}
你应该忘记以你的方式注入实体。如果要在HTTP会话中使其可用,请手动将其放在那里(例如,在登录后)。有关如何执行此操作的详细说明,请参阅此答案:https://stackoverflow.com/a/6355064/472792
假设你的UserOfUserBean
是一个支持bean,那么CDI就会变成这样的东西:
@Named(name="userUsed")
public class UserOfUserBean {
@Inject
@LoggedIn // see answer from jan groth
private User user;
}
或仅使用JSF注释:
@ManagedBean(name="userUsed") // from javax.faces.bean, not javax.annotation
public class UserOfUserBean {
@ManagedProperty("#{user}")
private User user;
// Mandatory setter for JSF-native injection
public void setUser(User user) {
this.user = user;
}
}
一些额外的资源: