2012-01-08 47 views
1

Hi @All :)在這裏我有一個奇怪的問題。我想在@EJB(beanName="user")的課程中注入UserBean管理實體。如果我不使用beanName屬性我得到以下錯誤信息:如果我使用它像這樣@EJB(beanName="user") UserBean user;在部署上找不到EJB beanName

org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name null 

我得到這個:

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

現在,當我看到這個,我說:「你是白癡」我自己過去。 – nyxz 2013-05-30 13:22:52

回答

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。

此外,@EJBbeanName屬性不對應於@ManagedBeanname屬性。如果接口是由多個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; 
    } 
} 

一些額外的資源:

+0

非常好,謝謝你的答案和詳細的答案。還有一個問題:你能給我一些關於EJB/JSF/CDI的好書的參考,因爲我認爲我完全搞砸了所有這些東西。 – nyxz 2012-01-08 14:49:30

+1

不客氣。我發現以下書籍對純EJB理論很有幫助:http://www.amazon.co.uk/dp/0596158025和http://www.amazon.co.uk/dp/1933988347以及JSF的以下內容:http: //www.amazon.co.uk/dp/0137012896和http://www.amazon.co.uk/dp/0071625097(儘管最後一個需要一些勘誤)。不幸的是,CDI沒有任何關於CDI的內容,更不用說關於CDI之間的相互關係(Cay的書有點關於CDI的文章)。據說http://www.amazon.co.uk/dp/0557078326包含一些,但我沒有時間閱讀它,所以我不知道肯定。 – 2012-01-08 15:40:51

+0

非常感謝Arjan Tijms :) – nyxz 2012-01-08 20:52:08