Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Управляемые компоненты JSF 2 и соглашение об именах их методов при использовании в выражениях EL (в сочетании с Spring)

Автор вопроса: Vladimir MatveevОтветов: 1

Насколько мне известно, в JSF EL используется стандартное соглашение JavaBeans для преобразования имен свойств / классов, т.е. пары методов (get|is)Property + setProperty преобразуются только в property:

public class SomeComponent {
    public String getAttribute() { ... }
    public void setAttribute(String attribute) { ... }
}

<h:outputText value="#{comp.attribute}" />

То же самое и с именами bean-компонентов (если только эти имена не указаны напрямую в аннотации @ManagedBean):

@ManagedBean
public class UsefulBean {
    ...
}

<h:outputText value="#{usefulBean.doSomething()}" />

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

@ManagedBean
public class URLManagerBean {
}

<h:outputText value="#{...ManagerBean.doSomething()}" />

Что должно быть вместо многоточия в предыдущем фрагменте?

Удивительно, но в Интернете практически нет информации об этом. Почти все примеры использования управляемых компонентов JSF используют имена компонентов без нескольких соседних заглавных букв в начале. В нескольких местах, которые мне удалось найти, предлагается, чтобы имена bean-компонентов, начинающиеся с нескольких заглавных букв, никак не преобразовывались, т.е. в предыдущем фрагменте кода это было бы URLManagerBean.

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

class URLManagerBean -> uRLManagerBean

То есть декапитализирована только первая буква аббревиатуры. Похоже, что проект работает хорошо, так что это соглашение как-то работает. Но IntelliJ IDEA это не нравится; он считает, что bean-компоненты JSF действительно должны называться URLManagerBean, если я не переименую их явно через аннотацию.

Я попытался изменить использование class URLManagerBean с uRLManagerBean на URLManagerBean, но, видимо, это не сработало - те страницы, на которых я это пробовал, перестали работать.

Теперь я думаю, что причина такого странного соглашения в том, что мы используем интеграцию Spring через SpringBeanFacesELResolver. Однако такое поведение нигде не задокументировано.

Есть какое-нибудь объяснение такому поведению?

springnaming-conventionsjavabeansjsf-2

Ответы

Ответ 1 · рейтинг 2 · M. Deinum

Какую @ManagedBean аннотацию вы используете? Тот из javax.faces.bean или javax.annotation?

В первом случае Spring не имеет к этому никакого отношения, поскольку это будет управляемый компонент JSF и будет следовать соглашениям, указанным в JSF.

В качестве значения атрибута name () принимается имя управляемого bean-компонента. Если значение атрибута name не указано или является пустой строкой, имя управляемого-компонента получается путем взятия части полного имени класса безусловного имени класса и преобразования первого символа в нижний регистр. Например, если аннотация ManagedBean находится в классе с полностью определенным именем класса com.example.Bean, и в аннотации нет атрибута name, имя управляемого-компонента считается bean-компонентом. Полное имя класса, к которому присоединена эта аннотация, считается управляемым-компонентом-классом. Источник: @ManagedBean javadocs

Во втором случае Spring находится в миксе, и тогда поведение будет отличаться в зависимости от того, какую версию Spring и / или параметр конфигурации вы используете. При использовании AnnotationConfigApplicationContext используется AnnotationBeanNameGenerator в соответствии с рекомендациями (и в результате будет получено 'URLManagerBean' в качестве имени компонента). Используя другие средства, вы можете получить DefaultBeanNameGenerator, который имеет гораздо более простой алгоритм.

Проще говоря, это может зависеть от того, какую версию Spring и какую аннотацию вы используете.

Ссылки

  • @ManagedBean Java Documentation
  • Источник для ManagedBeanConfigHandler, который генерирует имя компонента (эталонная реализация).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы