我有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」。我的錯在哪裏?
如果調試'utente = ejbFacade.setUtente(用戶);'線,是'utente'不爲空?我想說'setUtente(...)'方法或者是錯誤的命名(你試圖從EJB獲得一個實體),或者不是給定代碼的適當方法。 – dic19 2014-10-08 14:46:59
utente不爲null。它具有所有正確的字段值。從數據庫表到實體的正確途徑是什麼?我雖然這從EJB正面得到它是最好的方式....我添加了上面的代碼序列@ dic19 – 2014-10-08 14:53:53
方式是對的,但我會重命名'setUtente(...)'爲'getUtentePerNome(... )'因爲這就是這個方法實際做的。代碼中的所有內容看起來都很好,應該可以正常工作,但我沒有看到任何奇怪的東西請注意,'beans.xml'中缺少''標記,但我認爲這只是一個複製粘貼問題。 – dic19 2014-10-08 15:17:49