Mój były kolega rozpoczął dyskusję pół godziny temu na temat JavaBeans i dlaczego nie działały tak, jak chce w JSF. Szczególny przypadek dotyczy właściwości boolowskich.JavaBeans i introspekcja - pomieszane właściwości boolowskie i indeksowane?
. Dla właściwości Boolean nazwie isUrl
Eclipse generuje ten
private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}
Ale to nie działa w JSF. Zrobił to działa dodając public boolean getIsUrl()
Wdrożenie może być wadliwa, więc zróbmy pewien, kto ma rację, za pomocą API introspekcję .:
BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName() + ": " + pd.getReadMethod() +
" : " + pd.getWriteMethod());
}
Na powyższym kodzie, to drukuje obie metody - czyli Eclipse ma rację, JSF jest źle. Ale brzmiało to podejrzanie, ponieważ the specification nie wspomina nic o podwójnym "jest".
Ale podczas przeglądania specyfikacji zobaczyłem coś, czego nigdy nie używałem - tak zwane indeksowane właściwości. Możesz mieć private String[] bar
, a następnie public String getBar(int idx)
. A więc:
. Próbowałem tego z Introspector
i nie znalazłem metody odczytu paska. Wynik powyższego kodu: bar: null : null
. Więc przyszło mi do głowy - teraz introspector nie stosuje się do specyfikacji. Być może nie podążyło to w poprzednim przypadku i ostatecznie JSF ma rację. W rzeczywistości właściwości indeksowane mogą sprawić, że istnieją dwie metody odczytu dla danej właściwości. I nie jest to możliwe w klasie PropertyDescriptor
API introspekcji.
Na co to nas zaprowadzi - mamy prawdopodobnie uszkodzony API, który nie jest zgodny ze specyfikacją. Co prowadzi do innych implementacji specyfikacji (oczywiście JSF używa niestandardowego). Co prowadzi do dalszych nieporozumień i pomyłek.
Świadczy o tym, co mi przeszkadzało - w specyfikacji JavaBeans nazywają konwencje nazewnictwa dla metod "wzorców projektowych". Brzmi to źle dla mnie.
Więc teraz na pytania:
- jest spec jasne
- JavaBeans jest API introspekcji poprawne
- jest specyfikacja nowych JavaBeans potrzebne, przynajmniej do wyjaśnienia zachowania wartości logiczne (to subiektywny w pewnym zakresie)
Aktualizacja. wydaje się, że użycie JSF to raczej bean.isUrl
niż bean.url
. Co sprawia, że perfekci czują, że nie działają z akcesorium isUrl()
.
P.S. JDK 1.6.0_20, JSF 1.2, MyFaces
może coś w rodzaju właściwości C# będzie przydatny. – Bozho
Po przeczytaniu kodu introspektora, isXxxx powinien działać. Nazwa użytego pola nie ma znaczenia. Czy próbowałeś aktualizacji Java 6 23? –