Ho costruire un componente personalizzato in JSF 2.0JSF 2 componenti personalizzati con Expression Language per valore di attributo non attivano il setter attributo
Il tag è simile al seguente:
<x:myTag id="1" name="AAA" />
La corrispondente classe java :
@FacesComponent("a.b.c.MyTag")
public class UIMyTag extends UIInput {
private String name;
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
logger.debug(getName()); //prints null for name="#{dummyBean.name}"
// and AAA for name="AAA"
logger.debug(getAttributes().get("name")); // always correct value
...
}
....
}
Se uso
<x:myTag id="1" name="AAA" />
tutto funziona come previsto, ma quando uso EL per attributi myTag il metodo setName()
non viene mai chiamato. Così, per,
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
Ho sempre trovato null
per la name
proprietà dentro il mio metodo encodeBegin
. Dopo il debug, ho notato che il metodo setName
non viene mai chiamato. Ho pensato che forse qualcosa riguardo a EL incasina le cose (e credo ancora che la ragione sia correlata a ciò), ma la cosa veramente strana è che la proprietà id
funziona bene: il setter viene chiamato, e il valore è come previsto quando l'econding comincia.
Devo dire che se chiamo getAttributes().get("name")
dal metodo encodeBegin
ottengo il valore del nome corretto, ma sono incuriosito perché non funziona con getter e setter.
Qualche idea cosa manca al mio componente?
Grazie per la risposta! Vorrei chiedere se devo implementare qualche metodo speciale per distinguere tra diversi tipi di valori di attributi all'interno del mio componente. (Ho capito che UIComponentBase lo gestisce da solo) E se sì, c'è una buona pratica per farlo ?! – RaresI
No e in generale non dovresti nemmeno preoccupartene.Per ottenere il valore dell'attributo (valutato), basta richiamare il getter. – BalusC