Не могу найти @ Named CDI bean с именем по умолчанию в EL / Facelet


В учебнике jee6 я могу прочитать следующее:

Квалификатор @Named позволяет получить доступ к Бобу с помощью используя имя Боба, с первой буквой в нижнем регистре. Например, страница Facelets будет ссылаться на боб как принтер.

Вы можете указать аргумент для квалификатора @Named, чтобы использовать имя по умолчанию:

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

@Named
@ViewScoped
public class MTestBean {
...
}

Исключение;

javax.servlet.ServletException: /MyPage.xhtml @15,65 listener="#{mTestBean.init}": Target Unreachable, identifier 'mTestBean' resolved to null

Но если я использую

@Named("mTestBean")

Все работает нормально. Является ли это ожидаемым поведением? Есть ли способ, которым я могу перечислить, какие бобы доступны в EL, возможно, я предполагаю неправильное имя по умолчанию?

1 4

1 ответ:

На самом деле вы должны ссылаться на Боб, используя #{MTestBean.xxx}. Интересно, что NetBeans делает то же самое предположение относительно имени по умолчанию и будет автоматически заполняться #{mTestBean.xxx}. Как BalusC указал, что такое поведение именования не следовать спецификации JavaBean. Из раздела 8.8 -

... Для поддержки случайного использования всех имена в верхнем регистре, мы проверяем , являются ли первые два символа имени одновременно прописными и если так что оставьте его в покое . Так например, "Фообах" становится "фообах" "Z" становится " z" "Адрес" в "адрес" Мы предоставляем метод Интроспектора.капитализации, который реализует данное правило преобразования.

Что касается перечисления доступных бобов с CDI, ваш лучший выбор-javax.предприятие.впрыскивать.спи.BeanManager. Смотрите эту ссылку

EDIT: вот версия, слегка измененная по ссылке, чтобы отобразить имя EL, а не только класс.

public void listAllBeans() throws NamingException{
        //Get the BeanManager
        InitialContext initialContext = new InitialContext();
        BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

        //List all CDI Managed Beans and their EL-accessible name
        Set<Bean<?>> beans = bm.getBeans(Object.class,new AnnotationLiteral<Any>() {});
        for (Bean<?> bean : beans) {
            System.out.println(bean.getBeanClass().getName() + " / bean name = " + bean.getName());
        }
    }

И выход для нашего тестового Боба -

Ком.xxx. jsf.зернышки.MTestBean / bean name = MTestBean