2013-02-27 229 views
0

基本上我正在尝试使用primefaces的自动完成功能来搜索我的社交网络项目上的用户。我面临的问题是,无论何时新用户注册,自动填充功能有时都会在建议中显示新用户,有时不显示。通常情况下,用户在第一次注册自动填充时显示用户在建议中的姓名,而第二次用户注册时,他的姓名未显示在建议中。我认为userDB没有得到更新。但是每当我重新部署项目时,一切工作都正常。用户的名称显示在自动填充中。primefaces自动完成问题

1)的XHTML

<div class="det"> 
       <h:form style="float:right;font-size:small;">&nbsp;&nbsp;&nbsp; 
     <h:outputText value="Search your friends here." 
         style="font-size:small;color:#CCCCCC;" /> 
        <p:autoComplete id="auto" value="#{searchBean.selectedUser}" 
         completeMethod="#{searchBean.completeUser}" var="p" 
         itemLabel="#{p.userName}" itemValue="#{p}" 
         converter="userConverter" forceSelection="true" 
         style="width:300px;"> 
         <p:column> 
          <img src="../images/profilePicture/thumb/#{p.image}" 
           style="height: 40px; width: 40px;" /> 
         </p:column> 
         <p:column> 
        #{p.firstName} #{p.lastName} 
      </p:column> 
        </p:autoComplete> 
     &nbsp;<h:commandButton image="../Image/magnify.png" 
         action="#{searchBean.navigate}" style="height:20px;float:right;" /> 
        <br /> 
       </h:form> 
      </div> 

2)用户转换

package com.bean; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.ConverterException; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

import com.entity.User; 

public class UserConverter implements Converter { 

    public static List<User> userDB; 
    static EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird"); 
    static EntityManager em =emf.createEntityManager(); 

    static { 
     userDB = new ArrayList<User>(); 
     Query query = em.createQuery("SELECT u FROM User u", User.class); 
     userDB =query.getResultList(); 

    } 


    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { 
     if (submittedValue.trim().equals("")) { 
      return null; 
     } else { 
      try { 

       for (User p : userDB) { 
        if (p.getUserName().equalsIgnoreCase(submittedValue)) { 
         return p; 
        } 
       } 

      } catch(Exception exception) { 
       throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid user")); 
      } 
     } 

     return null; 
    } 

    public String getAsString(FacesContext facesContext, UIComponent component, Object value) { 
     if (value == null || value.equals("")) { 
      return ""; 
     } else { 
      return String.valueOf(((User) value).getUserName()); 
     } 
    } 

} 

3)搜索豆

package com.bean; 
import com.bean.UserConverter; 
import java.util.ArrayList; 
import java.util.List; 

import javax.faces.context.FacesContext; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.servlet.http.HttpSession; 

import com.entity.User; 

public class SearchBean { 
    private EntityManager em; 
    private User selectedUser; 
    private List<User> users; 

    public SearchBean(){ 
     users = UserConverter.userDB; 
     EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird"); 
     em =emf.createEntityManager(); 
    } 

    public User getSelectedUser() { 
     return selectedUser; 
    } 

    public void setSelectedUser(User selectedUser) { 
     this.selectedUser = selectedUser; 
    } 

    public List<User> completeUser(String query){ 
     List<User> suggestions = new ArrayList<User>(); 

     for(User u : users){ 
      if(u.getUserName().startsWith(query)) 
       suggestions.add(u); 
     } 

     return suggestions; 
    } 
    public String navigate(){ 
     User friend=em.find(User.class,selectedUser.getEmail()); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
     session.setAttribute("frienddet",friend); 
     return "searchsuccess"; 
    } 

} 

4)登记豆

package com.bean; 


import java.util.logging.Logger; 

import javax.faces.context.FacesContext; 
import javax.faces.event.ActionEvent; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 
import javax.servlet.http.HttpSession; 


import org.primefaces.event.FlowEvent; 


import com.entity.User; 

public class RegistrationBean { 

    User user ; 
    private EntityManager em; 
    private boolean skip; 
    private static Logger logger = Logger.getLogger(RegistrationBean.class.getName()); 
    public RegistrationBean(){ 
     user=new User(); 
     EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird"); 
     em =emf.createEntityManager(); 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 
    public boolean isSkip() { 
      return skip; 
     } 

     public void setSkip(boolean skip) { 
      this.skip = skip; 
     } 
    public String Save(){ 
     System.out.println("registration save called"); 
     em.getTransaction().begin(); 
     em.persist(user); 
     em.getTransaction().commit(); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
     session.setAttribute("userdet",this.user); 
     return "success"; 


    } 
    public String onFlowProcess(FlowEvent event) { 
      logger.info("Current wizard step:" + event.getOldStep()); 
      logger.info("Next step:" + event.getNewStep()); 

      if(skip) { 
       skip = false; //reset in case user goes back 
       return "confirm"; 
      } 
      else { 
       return event.getNewStep(); 
      } 
     } 

} 

5)报名XHTML

<p:growl id="growl" sticky="true" showDetail="true" /> 

       <p:wizard widgetVar="wiz" 
        flowListener="#{registrationBean.onFlowProcess}" 
        style="text-size:small;"> 

        <p:tab id="personal" title="Personal"> 

         <p:panel header="Personal Details"> 



          <h:panelGrid columns="3" columnClasses="label, value" 
           styleClass="grid"> 
           <h:outputText value="Username*" /> 
           <p:inputText id="usrname" required="true" label="Username" 
            value="#{registrationBean.user.userName}" 
            requiredMessage="Username required" /> 
           <p:message for="usrname"></p:message> 

           <h:outputText value="Firstname: *" /> 
           <p:inputText id="frstname" required="true" label="Firstname" 
            value="#{registrationBean.user.firstName}" 
            requiredMessage="Firstname required" /> 
           <p:message for="frstname"></p:message> 

           <h:outputText value="Lastname: *" /> 
           <p:inputText id="lstname" required="true" label="Lastname" 
            value="#{registrationBean.user.lastName}" 
            requiredMessage="Lastname required" /> 
           <p:message for="lstname"></p:message> 

           <h:outputText value="Password: *" /> 
           <p:password id="pwd1" value="#{registrationBean.user.password}" 
            feedback="true" match="pwd2" label="Password" required="true" 
            requiredMessage="Password required" /> 
           <p:message for="pwd1"></p:message> 

           <h:outputText value="Confirm Password: *" /> 
           <p:password id="pwd2" value="#{registrationBean.user.password}" 
            feedback="true" label="Confirm Password" required="true" /> 
           <p:message for="pwd2"></p:message> 

           <h:outputText value="Date of Birth:" /> 
           <p:calendar value="#{registrationBean.user.birthDate}" 
            pattern="dd/MM/yyyy" mode="popup" showOn="button" 
            navigator="true"></p:calendar> 
           <p:message for="frstname"></p:message> 

           <h:outputText value="Gender: " /> 
           <p:inputText label="Gender" 
            value="#{registrationBean.user.gender}" /> 
           <p:message for="frstname"></p:message> 

           <h:outputText value="Relationship Status: " /> 
           <p:inputText label="Relationship Status" 
            value="#{registrationBean.user.relationship}" /> 
           <p:message for="frstname"></p:message> 



           <h:outputText value="Skip to last: " /> 
           <h:selectBooleanCheckbox value="#{registrationBean.skip}" /> 
          </h:panelGrid> 
         </p:panel> 
        </p:tab> 

        <p:tab id="address" title="Address"> 
         <p:panel header="Adress Details"> 

          <h:messages errorClass="error" /> 

          <h:panelGrid columns="2" columnClasses="label, value"> 
           <h:outputText value="Street: " /> 
           <p:inputText value="#{registrationBean.user.street}" /> 

           <h:outputText value="City: " /> 
           <p:inputText label="City" value="#{registrationBean.user.city}" /> 

           <h:outputText value="Pincode: " /> 
           <p:inputText value="#{registrationBean.user.pincode}" /> 

           <h:outputText value="State: " /> 
           <p:inputText label="State" 
            value="#{registrationBean.user.state}" /> 

           <h:outputText value="Country: " /> 
           <p:inputText label="Country" 
            value="#{registrationBean.user.country}" /> 

           <h:outputText value="Skip to last: " /> 
           <h:selectBooleanCheckbox value="#{registrationBean.skip}" /> 
          </h:panelGrid> 
         </p:panel> 
        </p:tab> 

        <p:tab id="contact" title="Contact"> 
         <p:panel header="Contact Information"> 

          <h:messages errorClass="error" /> 

          <h:panelGrid columns="2" columnClasses="label, value"> 
           <h:outputText value="Email: *" /> 
           <p:inputText label="Email" 
            value="#{registrationBean.user.email}" /> 

           <h:outputText value="Contact Number: " /> 
           <p:inputText value="#{registrationBean.user.contactNo}" /> 

          </h:panelGrid> 
         </p:panel> 
        </p:tab> 
        <p:tab id="education" title="Education"> 
         <p:panel header="Education Information"> 

          <h:messages errorClass="error" /> 

          <h:panelGrid columns="2" columnClasses="label, value"> 
           <h:outputText value="Secondary School: " /> 
           <p:inputText label="Secondary School" 
            value="#{registrationBean.user.secondarySchool}" /> 

           <h:outputText value="High School: " /> 
           <p:inputText label="High School" 
            value="#{registrationBean.user.highSchool}" /> 
           <h:outputText value="College: " /> 
           <p:inputText label="College" 
            value="#{registrationBean.user.college}" /> 
           <h:outputText value="University: " /> 
           <p:inputText label="University" 
            value="#{registrationBean.user.university}" /> 
           <h:outputText value="Degree: " /> 
           <p:inputText label="Degree" 
            value="#{registrationBean.user.degree}" /> 

          </h:panelGrid> 
         </p:panel> 
        </p:tab> 
        <p:tab id="other" title="Other"> 
         <p:panel header="Other Information"> 

          <h:messages errorClass="error" /> 

          <h:panelGrid columns="2" columnClasses="label, value"> 
           <h:outputText value="Quote: *" /> 
           <p:inputText value="#{registrationBean.user.quote}" /> 

           <h:outputText value="About Me: " /> 
           <p:inputText value="#{registrationBean.user.aboutMe}" /> 
           <h:outputText value="Interest: " /> 
           <p:inputText value="#{registrationBean.user.interest}" /> 

          </h:panelGrid> 
         </p:panel> 
        </p:tab> 
        <p:tab id="confirm" title="Confirmation"> 
         <p:panel header="Confirmation"> 

          <h:panelGrid id="confirmation" columns="6"> 

           <h:outputText value="Username: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.userName}" /> 
           <h:outputText value="Firstname: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.firstName}" /> 
           <h:outputText value="Lastname: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.lastName}" /> 
           <h:outputText value="Password: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.password}" /> 
           <h:outputText value="Date of Birth: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.birthDate}" /> 
           <h:outputText value="Gender: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.gender}" /> 
           <h:outputText value="Relationship: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.relationship}" /> 
           <h:outputText value="EmailID: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.email}" /> 
           <h:outputText value="Contact No.: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.contactNo}" /> 
           <h:outputText value="Street: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.street}" /> 
           <h:outputText value="City: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.city}" /> 
           <h:outputText value="Pincode: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.pincode}" /> 
           <h:outputText value="State: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.state}" /> 
           <h:outputText value="Country: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.country}" /> 
           <h:outputText value="Secondary School: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.secondarySchool}" /> 
           <h:outputText value="High School: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.highSchool}" /> 
           <h:outputText value="College: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.college}" /> 
           <h:outputText value="University: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.university}" /> 
           <h:outputText value="Degree: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.degree}" /> 
           <h:outputText value="Quote: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.quote}" /> 
           <h:outputText value="About Me: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.aboutMe}" /> 
           <h:outputText value="Interest: " /> 
           <h:outputText styleClass="outputLabel" 
            value="#{registrationBean.user.interest}" /> 
           <h:outputText /> 
           <h:outputText /> 
          </h:panelGrid> 

          <p:commandButton value="Submit" update="growl" 
           action="#{registrationBean.Save}" /> 

         </p:panel> 
        </p:tab> 

       </p:wizard> 
+0

您没有发布UserConverter类的代码。无论哪种方式,我怀疑你的问题是为每个bean使用单独的EntityManagerFactory实例。 – rootkit 2013-02-27 16:05:53

+0

雅对不起,我错误地给了UserConverter类的错误代码,我纠正了它。 – 2013-02-27 18:03:38

+0

请张贴代码,添加和坚持我已经包括注册豆和登记XHTML – rootkit 2013-02-27 18:28:56

回答

1

static { 
     userDB = new ArrayList<User>(); 
     Query query = em.createQuery("SELECT u FROM User u", User.class); 
     userDB =query.getResultList(); 

    } 

初始化你的用户列表。第一次加载UserConverter类时会发生一次(When is the static block of a class executed?)。您在生成自动填充建议时参考此列表。

当您添加新用户时,该列表永远不会重新生成。这就是为什么你没有看到新增用户。

创可贴的方法是代码进入类的方法,并调用它每次添加一个新用户或需要生成建议列表:

public class UserConverter implements Converter { 

public static void regenerateUserDB { 
    Query query = em.createQuery("SELECT u FROM User u", User.class); 
    userDB = query.getResultList(); 
} 

} 

public class SearchBean { 

public List<User> completeUser(String query){ 
    List<User> suggestions = new ArrayList<User>(); 
    UserConverter.regenerateUserDB(); 
    for(User u : UserConverter.userDB){ 
     if(u.getUserName().startsWith(query)) 
      suggestions.add(u); 
    } 

    return suggestions; 
} 
} 

一种合适的方式来解决,这将是要使用依赖注入框架,所以您不必在每个使用的类中构建新的EMF,这会浪费资源并导致问题。请参阅http://en.wikipedia.org/wiki/Dependency_injection#Java

+0

新用户 – 2013-02-27 21:38:24

+0

我提供了一些代码建议。你的问题没有任何在这个阶段做JSF - 它的所有Java/JPA – rootkit 2013-02-27 21:45:01

+0

添加以下代码保存RegistrationBean的方法: '查询查询= em.createQuery(“选择[u] FROM用户U”用户。类); \t \t UserConverter.userDB = query.getResultList();' 因此,每次添加新用户时,userDB都会更新,问题得到解决 – 2013-02-27 21:54:36