Я неправильно понимаю соглашение об именовании методов JavaBean или это аномалия? - PullRequest
6 голосов
/ 08 апреля 2011

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

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

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

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

cFrags:[${topic.cFrags}]

, где topic - это объект типа bean-компонента.

Вот ошибка:

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

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

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

Ответы [ 2 ]

12 голосов
/ 08 апреля 2011

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

cFrags:[${topic.CFrags}]

С большой буквы C. См. JavaBeans Spec :

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

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

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

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

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

8 голосов
/ 08 апреля 2011

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

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

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

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

...