2014-10-07 86 views
2

我有JSF2 @ManagedProperty註釋的問題。我有一個託管bean創建一個用戶,然後我想通過這個用戶到另一個bean來顯示其他信息相對於該用戶。所以我的代碼如下:JSF @ManagedProperty和@PostConstruct

@Named("userController") 
@SessionScoped 
public class UserController implements Serializable { 

@EJB 
private session.UserFacade ejbFacade; 
private List<User> items = null; 
private User selected; 
private User utente; 
private String user; 
private String pass; 
----getter and setter---- 

在計劃豆我用的是UserController中豆在@PostConstruct:

@Named(value = "scheduleController") 
@SessionScoped 
public class ScheduleController implements Serializable { 

private ScheduleModel eventModel; 

private ScheduleEvent event = new DefaultScheduleEvent(); 

@EJB 
ActivityFacade ejbFacade; 

@ManagedProperty(value="#{userController}") 
private UserController credentials; 


public ScheduleController() {   
} 

@PostConstruct 
public void init(){ 
    eventModel = new DefaultScheduleModel();  
    List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser()); 
    for(int i=0;i<daFare.size();i++){ 
     eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre())); 
    } 
} 

public void setCredentials(UserController credentials) { 
    this.credentials = credentials; 
} 

當我調試的代碼,我看到UserController的憑據總是空。 ... 怎麼了 ?我需要在faces-config.xml中指定一些東西? 非常感謝您的提示。

編輯:

後變化@ManagedProperty與@注入,並添加WEB-INF文件夾下面的beans.xml後,問題仍然存在。

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

這樣的應用程序的工作: 用戶可以通過這個XHTML頁面登錄:

<body> 
    <h:form> 
     <p:growl id="msgs" showDetail="true" /> 
     <p:panel header="Inserisci i tuoi dati" style="margin: 0 auto; text-align: center" > 
      <h:panelGrid columns="2" cellpadding="5" style="margin: 0 auto; text-align: center"> 
       <p:outputLabel value="Username"/> 
       <p:inputText value="#{userController.user}" required="true" label="Username" size="40"/> 
       <p:outputLabel value="Password" /> 
       <p:password value="#{userController.pass}" required="true" label="Password" size="40"/> 
       <p:commandButton action="#{userController.validateLogin}" value="Login" update="msgs" ajax="false" style="text-align: center"/> 
      </h:panelGrid> 
     </p:panel>   
    </h:form> 

</body> 

提交表單後,UserController的驗證此特定用戶的存在一個數據庫表,然後實例化用戶utente(id,用戶名,密碼,email爲字段)。之後,應用程序重定向到home.xhtml,顯示幾個用戶的信息,並選擇用戶ID選擇的數據庫表的幾個信息。 這裏是我設置用戶utente的代碼:

public String validateLogin(){ 

    String output="home"; 
    boolean exist=false; 
    exist=ejbFacade.logValid(user,pass); 
    if(!exist){ 
     //FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Username o Password errata","Contattare l'amministratore"));    
     return "index"; 
    }else{ 
     utente=ejbFacade.setUtente(user); 
     FacesContext context = FacesContext.getCurrentInstance();   
     context.addMessage(null, new FacesMessage("Accesso eseguito con successo.","Bentornato " + user)); 
     return output; 
    } 
} 

碼序列中,我控制用戶的existece並設置utente是:

@Stateless 
public class UserFacade extends AbstractFacade<User> { 
@PersistenceContext(unitName = "ImmobiliareWebPU") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public UserFacade() { 
    super(User.class); 
} 

public boolean logValid(String user, String pass) { 
    List<User> utente ; 
    boolean autorizzato; 
    String find = "User.findByUsername&Password"; 
    Query query = em.createNamedQuery(find, User.class); 
    query.setParameter("username", user); 
    query.setParameter("password", pass); 
    utente =query.getResultList(); 
    if (utente.isEmpty()) { 
     autorizzato=false;   
    } 
    else{ 
     autorizzato=true;      
    } 
    return autorizzato; 
} 

public User setUtente(String user) { 
    //SETTO L'UTENTE PER LA SESSIONE DEL PROGRAMMA 
    User utente; 
    String find = "User.findByUsername"; 
    Query query = em.createNamedQuery(find, User.class); 
    query.setParameter("username", user);  
    utente =(User) query.getSingleResult(); 

    return utente; 
} 

}

代碼我需要的用戶的信息是:

@Named(value = "scheduleController") 
@RequestScoped 
public class ScheduleController implements Serializable { 

private ScheduleModel eventModel; 

private ScheduleEvent event = new DefaultScheduleEvent(); 

@EJB 
ActivityFacade ejbFacade; 

@Inject 
private UserController credentials; 


public ScheduleController() {   
} 

@PostConstruct 
public void init(){ 
    eventModel = new DefaultScheduleModel();  
    List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser()); 
    for(int i=0;i<daFare.size();i++){ 
     eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre())); 
    } 
} 

在ejbFacade我做了一個簡單的查詢:

@Stateless 
public class ActivityFacade extends AbstractFacade<Activity> { 
@PersistenceContext(unitName = "ImmobiliareWebPU") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public ActivityFacade() { 
    super(Activity.class); 
} 

public List<Activity> findForUser(int utenteId) { 
    //RICHIEDO LE ATTIVITA' DEL SINGOLO UTENTE 
    List<Activity> daFare ; 
    String find = "Activity.findByUserId"; 
    Query query = em.createNamedQuery(find, Activity.class); 
    query.setParameter("idUser", utenteId); 
    daFare =query.getResultList(); 

    return daFare; 
} 

} 

在調試模式下,我看到UserController的所有空字段;它似乎是UserController的新功能。我也使用「import javax.enterprise.context.SessionScoped」。我的錯在哪裏?

+0

如果調試'utente = ejbFacade.setUtente(用戶);'線,是'utente'不爲空?我想說'setUtente(...)'方法或者是錯誤的命名(你試圖從EJB獲得一個實體),或者不是給定代碼的適當方法。 – dic19 2014-10-08 14:46:59

+0

utente不爲null。它具有所有正確的字段值。從數據庫表到實體的正確途徑是什麼?我雖然這從EJB正面得到它是最好的方式....我添加了上面的代碼序列@ dic19 – 2014-10-08 14:53:53

+0

方式是對的,但我會重命名'setUtente(...)'爲'getUtentePerNome(... )'因爲這就是這個方法實際做的。代碼中的所有內容看起來都很好,應該可以正常工作,但我沒有看到任何奇怪的東西請注意,'beans.xml'中缺少''標記,但我認爲這只是一個複製粘貼問題。 – dic19 2014-10-08 15:17:49

回答

3

當我調試代碼時,我看到UserController憑據是 始終爲空....出了什麼問題?

請注意您將CDI (Context and Dependency Injection)與託管屬性混合在一起,這可能會導致所描述的行爲。您的bean註釋與@ManagedBean@Named代替這樣的:

@Inject 
    private UserController credentials; 

有關CDI和支持bean之間的區別一個真正偉大的解釋見@BalusC答案:

@ManagedProperty(value="#{userController}") 
    private UserController credentials; 

應該由該所取代本主題:Backing beans (@ManagedBean) or CDI Beans (@Named)?


我需要指定faces-config.xml中的東西嗎?

不,但您應該包括一個beans.xml,如此處所示:Packaging CDI applications。據我記得這個文件是強制性的,無論發現模式。這裏是beans.xml,你可以在NetBeans的自動生成:

新文件 - >上下文和依賴注入 - >的beans.xml(CDI配置文件)

這是所有我曾經需要做CDI工作:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="annotated"> 
</beans> 
+0

謝謝你的回答。現在我知道Named和ManagedBean是有區別的。但問題依然存在!現在,在使用Inject替換ManagedProperties並創建空白beans.xml文件後,在調試代碼時,我看到包含注入的UserController的變量具有全部空字段。有什麼我應該改變?這似乎是UserController的一個新變種,而不是我第一次被遺忘。再次感謝您的回覆。 – 2014-10-08 07:24:30

+0

好消息是注射正在工作。請注意,您不必明確地安裝任何東西,因爲這兩個bean都被管理。如果'UserController'看起來像一個新的實例,因爲容器之前沒有創建實例(因爲它不是必需的)。如果不知道應用程序中的流程,很難給出具體的答案。也許你可以在你的bean被調用的地方發佈序列,而不僅僅是他們的定義。 @ClaudioCerino – dic19 2014-10-08 11:39:34

+0

我已經編輯了代碼序列的問題。我希望你能照亮我。再次感謝@ dic19 – 2014-10-08 14:29:15