在部署时找不到EJB beanName

时间:2012-01-08 02:16:30

标签: java deployment ejb-3.0

嗨@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

1 个答案:

答案 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;
    }
}

一些额外的资源: