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

Насколько мне известно, в 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. Однако такое поведение нигде не задокументировано.

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


person Vladimir Matveev    schedule 09.09.2013    source источник


Ответы (1)


Какую @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 и какую аннотацию вы используете.

Ссылки

person M. Deinum    schedule 09.09.2013
comment
@ManagedBean - это java.faces.bean.ManagedBean. Я думаю, что это вина Spring, потому что используется его EL-преобразователь. Кстати, версия Spring - 3.1.3.RELEASE. - person Vladimir Matveev; 09.09.2013
comment
Я сомневаюсь, что, поскольку bean-компонент является управляемым bean-компонентом JSF, а не управляемым bean-компонентом Spring (если вы также не настроите свои управляемые bean-компоненты JSF явно в Spring). javax.faces.bean.ManagedBean не обрабатывается Spring. Я изменил свой ответ, включив в него соглашение JSF, как указано в документе. - person M. Deinum; 09.09.2013
comment
Итак, это правильное поведение? Почему же тогда IDEA считает, что имена bean-компонентов с сокращениями не следует преобразовывать? (Это, конечно, риторический вопрос. Если это действительно правильное поведение, я сообщу им об ошибке.) - person Vladimir Matveev; 09.09.2013
comment
Я просто изменял ответ, чтобы включить ссылку на исходный код композиции, которая генерирует имя. Так что да, согласно документации и реализации JSF, это правильное поведение. Убедитесь, что для вашего проекта в IDEA включен JSF. - person M. Deinum; 09.09.2013
comment
Большое Вам спасибо. Да, JSF включен, поэтому я и заметил проблему в первую очередь. Думаю, тогда я пойду в багтрекер Jetbrains. - person Vladimir Matveev; 09.09.2013