ich eine benutzerdefinierte Komponente in JSF bauen 2.0JSF 2 Benutzerdefinierte Komponenten Expression Language für Attribut-Wert auslösen nicht das Attribut Setter
Der Tag sieht wie folgt aus:
<x:myTag id="1" name="AAA" />
Die entsprechende Java-Klasse :
@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
...
}
....
}
Wenn ich
<x:myTag id="1" name="AAA" />
verwenden
alles funktioniert wie erwartet, aber wenn ich EL für myTag Attribute verwende, wird die setName()
Methode nie aufgerufen. Also für,
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
Ich bekomme immer null
für die name
Eigenschaft in meiner encodeBegin
Methode. Nach dem Debuggen ist mir aufgefallen, dass die Methode setName
nie aufgerufen wird. Ich dachte, dass etwas in Bezug auf EL Dinge vermasselt (und ich glaube immer noch, dass der Grund damit zusammenhängt), aber was wirklich seltsam ist, ist dass die id
Eigenschaft gut funktioniert: der Setter wird aufgerufen, und der Wert ist wie erwartet beginnt.
Ich muss erwähnen, dass, wenn ich getAttributes().get("name")
von der encodeBegin
Methode aufrufen ich den richtigen Namen Wert, aber ich bin fasziniert, warum es nicht mit Getter und Setter funktioniert.
Irgendwelche Ideen, was zu meiner Komponente fehlt?
Danke für die Antwort! Ich möchte fragen, ob ich eine spezielle Methode implementieren muss, um zwischen verschiedenen Typen von Attributwerten innerhalb meiner Komponente zu unterscheiden. (Ich habe verstanden, dass UIComponentBase es eigenständig handhabt) Und wenn ja, gibt es eine Best Practice, das zu tun ?! – RaresI
Nein, und Sie sollten sich auch nicht darum kümmern.Um den (bewerteten) Attributwert zu erhalten, rufen Sie einfach den Getter auf. – BalusC