Я неправильно понимаю соглашение об именах методов JavaBean или это аномалия?

У меня есть загадочные события в моем коде. Вот фрагмент из бина:

public List<HelpContentsFrag> getCFrags()
{
    return cFrags;
}

public void setCFrags(List<HelpContentsFrag> frags)
{
    cFrags = frags;
}

Вот фрагмент кода моего представления (файл тега)

cFrags:[${topic.cFrags}]

где тема — это объект типа bean.

Вот ошибка:

javax.el.PropertyNotFoundException: Property 'cFrags' not found on type com.company.beans.BeanClass

Еще одна вещь, которую следует учитывать. Существует небольшая разница в сеттере, сгенерированном затмением. Судя по всему, имя cFrags ему тоже не понравилось. Имя поля — cFrags, и с каждым другим установщиком я получаю параметр с тем же именем, что и поле, и он устанавливается с использованием соглашения this.fieldName = fieldName. Вы заметите, что eclipse не придерживается этого на этом сеттере.

К вашему сведению: все это отлично работает, когда я меняю геттер на getContentsFrag() и ссылаюсь на него .contentsFrag.


person KSev    schedule 08.04.2011    source источник


Ответы (2)


Я верю, что вы хотите:

cFrags:[${topic.CFrags}]

С большой буквы C. См. спецификацию JavaBeans:

8.8 Использование заглавных букв в предполагаемых именах.

Когда мы используем шаблоны проектирования для вывода имени свойства или события, нам нужно решить, каким правилам следует следовать для написания выведенного имени с заглавной буквы. Если мы извлечем имя из середины обычного имени Java в стиле MixCase, то имя по умолчанию будет начинаться с заглавной буквы. Программисты Java привыкли к тому, что обычные идентификаторы начинаются со строчных букв. Энергичный вклад рецензентов убедил нас в том, что мы должны следовать тому же общепринятому правилу для имен свойств и событий.

Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы обычно преобразуем первый символ в нижний регистр. Однако для поддержки случайного использования всех имен в верхнем регистре мы проверяем, являются ли первые два символа имени заглавными, и если да, то оставляем их в покое. Так, например,

«FooBah» становится «fooBah»
«Z» становится «z»
«URL» становится «URL»

Мы предоставляем метод Introspector.decapitalize, реализующий это правило преобразования.

person WhiteFang34    schedule 08.04.2011
comment
Я просто использовал getContentsFrag, пока не прочитал это. Я удивлен, что не попробовал это перед публикацией. В любом случае, спасибо за совет. Я изменил его на CFrags, и все пошло хорошо. Я предполагаю, что понимания контекста иногда недостаточно. Еще раз спасибо! - person KSev; 29.04.2011

Чтобы процитировать спецификацию JavaBeans (последнее обновление в 1997 г.) :

Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы обычно преобразуем первый символ в нижний регистр. Однако, чтобы поддерживать случайное использование всех имен в верхнем регистре, мы проверяем, являются ли первые два символа имени заглавными, и если да, то оставляем их в покое.

Это описывает, как имена методов преобразуются в имена свойств. Что не так ясно, так это то, что Introspector производит единая таблица, которая также используется при поиске свойства-> метода.

Вы уже нашли один способ избежать проблемы. Другой способ — создать класс BeanInfo, содержащий правильное сопоставление свойства->метода (документ Introspector описывает, как это сделать).

person Anon    schedule 08.04.2011