Ein ehemaliger Kollege von mir begann vor einer halben Stunde eine Diskussion über JavaBeans, und warum sie nicht so funktionierten, wie er es in JSF will. Im speziellen Fall geht es um boolesche Eigenschaften.JavaBeans und Introspektion - versaut auf booleschen und indizierten Eigenschaften?
. Für eine Boolesche Eigenschaft namens isUrl
Eclipse-generiert diese
private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}
Aber in JSF nicht funktioniert. Er machte es Arbeit durch Hinzufügen public boolean getIsUrl()
Die Umsetzung könnte fehlerhaft sein, so lassen Sie uns sicherstellen, wer Recht hat, durch die Selbstbeobachtung API .:
BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName() + ": " + pd.getReadMethod() +
" : " + pd.getWriteMethod());
}
Für den obigen Code, diese beiden Methoden druckt - dh Eclipse ist richtig, JSF ist falsch. Aber das klang mir verdächtig, da the specification nichts über das doppelte "ist" erwähnt.
Aber während ich durch die Spezifikation schaute, sah ich etwas, das ich nie benutzt habe - die so genannten indizierten Eigenschaften. Sie können private String[] bar
und dann public String getBar(int idx)
haben. Also:
. Ich habe das mit der Introspector
versucht, und es hat keine Lese-Methode für bar gefunden. Das Ergebnis aus dem obigen Code war: bar: null : null
. So kam ich zu denken - jetzt folgt der Introspektor nicht der Spezifikation. Vielleicht ist es ihm im vorhergehenden Fall nicht gefolgt, und schließlich hat JSF Recht. Tatsächlich können indexierte Eigenschaften so aussehen, dass es zwei Lesemethoden für eine bestimmte Eigenschaft gibt. Und das ist mit der Klasse PropertyDescriptor
der Introspektions-API nicht möglich.
Was führt uns dazu - wir haben eine möglicherweise kaputte API, die nicht der Spezifikation entspricht. Das führt zu anderen Implementierungen der Spezifikation (JSF verwendet offensichtlich eine benutzerdefinierte). Das führt zu weiteren Missverständnissen und Verwirrungen.
Eine Randnotiz für etwas, das mich gestört hat - in der JavaBeans-Spezifikation nennen sie die Namenskonventionen für die Methoden "Design Patterns". Das klingt falsch für mich.
So, nun auf die Fragen:
- die Java Beans-Spezifikation klar
- ist die Selbstbeobachtung API korrekt
- wird eine neue Java Beans-Spezifikation erforderlich, zumindest ist das Verhalten von booleans zu klären (das ist subjektiv bis zu einem gewissen Grad)
Update. Es scheint, dass die JSF-Verwendung bean.isUrl
eher als bean.url
ist. Was macht Sinn, nicht mit isUrl()
Accessor zu arbeiten.
P.S. JDK 1.6.0_20, JSF 1.2, MyFaces
vielleicht wird so etwas wie C# -Eigenschaften nützlich sein. – Bozho
Nach dem Lesen des Introspector-Codes sollte isXxxx funktionieren. Der verwendete Feldname spielt keine Rolle. Hast du Java 6 Update 23 ausprobiert? –