2014-10-07 46 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