Мой бывший коллега полчаса назад начал обсуждение JavaBeans и почему они не работают в JSF так, как он хочет. Частный случай касается логических свойств.
1 . Для логического свойства с именем isUrl
Eclipse генерирует это
private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}
. Но это не работает в JSF. Он заставил это работать, добавив public boolean getIsUrl ()
Реализация могла быть ошибочной, поэтому давайте убедимся, кто прав, с помощью API интроспекции. :
BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName() + ": " + pd.getReadMethod() +
" : " + pd.getWriteMethod());
}
Для приведенного выше кода это печатает оба метода - т.е. Eclipse прав, JSF ошибочен. Но это показалось мне подозрительным, поскольку спецификация ничего не упоминает о двойном «is».
Но, просматривая спецификацию, я увидел то, что никогда не использовал - так называемый индексированные свойства. У вас может быть приватная строка [] bar
, а затем публичная строка getBar (int idx)
. Итак:
2 . Я попробовал это с помощью Introspector
, и он не нашел метода чтения для бара. Результатом приведенного выше кода было: bar: null: null
. Поэтому я подумал - теперь интроспектор не следует спецификации. Возможно, в предыдущем случае этого не последовало, и в конечном итоге JSF прав. Фактически, индексированные свойства могут иметь два метода чтения для данного свойства. А это невозможно с классом PropertyDescriptor
API интроспекции.
К чему это привело - у нас есть, возможно, неисправный API, который не соответствует спецификации. Это приводит к другим реализациям спецификации (очевидно, в JSF используется пользовательский вариант). Это ведет к дальнейшим недоразумениям и недоразумениям.
Замечание по поводу того, что меня беспокоило - в спецификации JavaBeans соглашения об именах для методов называются «шаблонами проектирования». Мне это кажется неправильным.
Итак, теперь к вопросам:
Обновление. похоже, что используется JSF bean.isUrl
, а не bean.url
. Поэтому лучше всего не работать с аксессором isUrl ()
.
PS JDK 1.6.0_20, JSF 1.2, MyFaces