JSF injection avec la gestion de la propriété, un bon modèle?
Je suis assez nouveau à JSF et pas vraiment "utilisé" pour les différents penser si je suis en difficulté sur ce que (je suppose) est de base.
Permet de dire que j'ai une classe de l'Utilisateur, qui est un bean de session.
Permet de dire que j'ai un contrôleur de 10000 objets, disons de l'Usine, qui doit être en mesure de régler certaines d'entre eux comme "verrouillé", dans notre cas, cela signifie que le "verrouillé" champ n'est pas nul, mais plus référence à un "LockedItem" objet.
C'est là que je ne peux pas faire les choses à travailler : LockedItem, lorsque vous l'instancier, est censé de référence de l'utilisateur actuellement connecté. Comment suis-je censé faire ?
J'ai essayé d'injection avec @managedproperty, mais elle est nulle en LockedItem.constructeur (ce qui est normal je suppose) puis j'ai essayé dans un @PostConstruct méthode, mais la méthode n'est jamais appelé (pourquoi ? Même si je me fais un managedbean... sont les postconstruct méthodes appelée lorsque l'objet est créé par l' ".xhtml" ?)
Ou dois-je utiliser un "java se" tromper, comme l'élaboration de l'Utilisateur statique ?
Code de préciser pourquoi un @PostConstruct pas appelé (celui de "Siège") :
.xhtml
<h:outputLabel id="user" value="Hello #{user.name}" />
<h:outputLabel id="car" value="you have #{car.brand}" />
Utilisateur
package test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class User implements Serializable {
private String name ;
public User()
{
name = "toto";
System.out.println("User constructor");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Voiture
package test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class Car implements Serializable {
private String brand ;
private Seat seat ;
public Car()
{
brand = "audi" ;
seat = new Seat();
System.out.println("Car constructor") ;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
Siège
package test;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
@ManagedBean
public class Seat implements Serializable {
private int nb ;
private String userName ;
@ManagedProperty("#{user}")
private User user ;
public Seat()
{
nb = 4 ;
userName="na";
System.out.println("! Seat constructor ") ;
}
@PostConstruct
public void init()
{
System.out.println("!! Seat postconstruct : "+user.getName());
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getNb() {
return nb;
}
public void setNb(int nb) {
this.nb = nb;
}
}
Merci !
Vous devez vous connecter pour publier un commentaire.
La
@PostConstruct
est la bonne façon.Il n'est pas nécessaire si vous instanciez le haricot-vous à l'aide de
new
opérateur (évidemment). Elle est appelée uniquement si JSF instancie et gère le bean lui-même dès qu'il est référencé pour la première fois dans EL contexte comme#{bean}
. Cela se produit généralement dans la vue de côté, mais cela peut également se produire dans le modèle/contrôleur de côté par@ManagedProperty("#{bean}")
ouApplication#evaluateExpressionGet()
.Vous devez absolument ne pas faire la
User
statique. Il serait partagée applicationwide, pas sessionwide.Une alternative est de simplement passer le courant
User
comme argument du constructeur deLockedItem
, ou pour invoquer la méthode d'initialisation vous, pour sûr, si cette catégorie ne représente pas une pièce de théâtre JSF backing bean à tous.@ManagedProperty("#{seat}")
au lieu denew Seat()
.LibraryObject
qui est abstrait et définit une implémentation par défaut pour le verrouillage d'un objet (qui est, en l'associant à uneLockedItem
).LockedItem
doit savoir qui est leUser
(session bean) pour obtenir son nom. Initialement, niLibraryObject
niLockedItem
sont les haricots. La meilleure façon de le faire, il semble faire leLibraryObject
un managedBean sur lequel j'ai injecter leUser
et, comme vous l'avez dit, de créer un nouveauLockedItem
donnant laUser
de référence, mais je ne peux pas depuis son résumé... une idée ?