gpt4 book ai didi

java - 在部署时找不到 EJB beanName

转载 作者:行者123 更新时间:2023-11-29 06:05:11 25 4
gpt4 key购买 nike

嗨@All :) 我这里有一个奇怪的问题。我想用 @EJB(beanName="user") 在类中注入(inject) UserBean 托管实体。如果我不使用 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 以及我如何注入(inject)它:

用户Bean

// 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;
}

接口(interface)为空,标记为@Local

最佳答案

对不起,这在很多层面上都是错误的,以至于很难从哪里开始。

首先,@Local 批注对您显示的代码毫无用处。它用于将接口(interface)标记为 EJB 的业务接口(interface),或指向这样的接口(interface)。

然后,实体 UserBean 可能不应该是作用域和托管 bean。这些注释用于让 bean 容器管理 bean 的生命周期,但如果是实体,则由实体管理器负责。

不清楚您在这里使用的是 JSF 还是 Java EE ManagedBean 注释,但根据上述解释,后者永远不需要,第一个也不应该需要。

此外,根据典型的约定,考虑仅将实体命名为 User 并且不要让它实现接口(interface)。

UserOfUserBean 更难破译。这个 bean 应该是一个业务服务还是一个(JSF)支持 bean?如果它是一个支持 bean,则不需要 @Stateful 注释,否则就不需要 @ManagedBean 注释。

那么,您的问题的罪魁祸首是:@EJB 批注不能注入(inject)非 EJB bean。 JPA 实体 (@Entity) 和 JSF 托管 bean (@javax.faces.bean.ManagedBean) 不是 EJB bean。

另外,@EJBbeanName属性对应中的name属性@ManagedBean。如果一个接口(interface)由多个 bean 实现并且与 JSF 托管 bean 名称或 Java EE 托管 bean 名称无关,则 bean 名称是一个 EJB 内部事物,用于消除注入(inject)歧义。 (不适用于您的问题,但 CDI 的 @Named 和 JSF 的托管 bean 名称之间存在关系)

最后,实体和支持 bean 都需要标记为 @Local 的空接口(interface)。

所以,你的实体应该变成这样:

@Entity
@Table(name="t_user")
public class User implements Serializable {
// fields (@Columns, etc.)
// setters / getters
}

并且您应该忘记以您的方式注入(inject)实体。如果你想让它在 HTTP session 中可用,请手动将它放在那里(例如,在登录后)。有关如何执行此操作的更详细解释,请参阅此答案: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;
}
}

一些额外的资源:

关于java - 在部署时找不到 EJB beanName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com