Не могу найти @ 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 ответ:
На самом деле вы должны ссылаться на Боб, используя #{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