Не удается найти bean-компоненты с аннотацией @ManagedBean

При обновлении JSF-версии старого веб-приложения с MyFaces 1.1 до MyFaces 2.2.12 я пытаюсь заменить записи <managed-bean> в моем файле faces-config.xml аннотациями @ManagedBean непосредственно в классах компонентов. Я использую Миграцию с JSF 1.2 на JSF 2.0 в качестве общего руководства по миграции.

Например, я заменяю что-то вроде

<managed-bean>
    <managed-bean-name>MyBean</managed-bean-name>
    <managed-bean-class>some.package.MyBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

с участием

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class MyBean {

Согласно Будет ли два экземпляра компонента, если я напишу аннотацию @managed bean и определю ее в Faces-config.xml, аннотации будут перезаписаны соответствующими записями в faces-config.xml, поэтому я удалил элемент <managed-bean> в мой faces-config.xml.

Поскольку проект состоит из нескольких модулей maven, которые упакованы в виде банок по отдельности перед развертыванием в виде комбинированного файла войны, я также попытался последовать совету из Как JSF находит bean-компоненты с аннотацией @ManagedBean? и добавил еще одну папку META-INF, содержащую faces-config.xml, в подмодуль, содержащий bean-компонент, в следующем месте (с учетом принятый ответ в Как ссылаться на управляемые компоненты JSF, которые предоставлены в файле JAR?):

MainProject
|  SubModule
|     |src
|       | main
|          | resources
|             | META-INF
|                | faces-config.xml

со следующим содержанием:

<faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">
</faces-config>

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

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'MyBean' resolved to null

Поскольку я использую JSF для управления bean-компонентами, я следовал части инструкций JSF в Идентификация и решение javax.el.PropertyNotFoundException: Target Unreachable, но даже после проверки отдельных точек, упомянутых там, я все равно получаю ту же ошибку.

Я использую Tomcat 7 в качестве контейнера сервлетов, который, согласно http://tomcat.apache.org/whatversion.html — поддерживает спецификацию сервлета до версии 3.0, чего, в свою очередь, должно хватить для JSF 2.2, для которого, если я правильно понимаю, требуется как минимум спецификация сервлета 2.5, согласно http://myfaces.apache.org/core22/.

Я уже довольно много искал причину проблемы (как уже упоминалось, я пробовал несколько статей SO, упомянутых выше), но до сих пор не могу решить проблему. Буду очень благодарен за любую помощь!


person scholt    schedule 23.05.2017    source источник
comment
Небольшое предложение: в JSF 2.3 аннотация @ManagedBean устарела в пользу использования CDI @Named. Разве сейчас не самое подходящее время, чтобы переключиться на это напрямую вместо @ManagedBean?   -  person Kukeltje    schedule 23.05.2017
comment
@Kukeltje Спасибо за предложение. Я думал о переходе на CDI и аннотацию @Named, но столкнулся со многими другими проблемами. Но, возможно, вы правы, и я должен попытаться решить эти проблемы вместо того, чтобы заставить работать что-то, что скоро устареет.   -  person scholt    schedule 23.05.2017


Ответы (1)


Ответ можно найти в @ManagedBean Javadoc:

Значение атрибута ManagedBean.name принимается равным managed-bean-name. Если значение атрибута имени не указано или является пустым String, managed-bean-name получается путем взятия неполной части имени класса из полного имени класса и преобразования первого символа в нижний регистр. Например, если аннотация ManagedBean относится к классу с полным именем класса com.foo.Bean и в аннотации нет атрибута имени, managed-bean-name принимается за bean. Полное имя класса, к которому присоединена эта аннотация, принимается за managed-bean-class.

Итак, ваш компонент называется myBean, а не MyBean. Если вы хотите, чтобы это было MyBean, укажите имя с аннотацией: @ManagedBean(name = "MyBean").

person Jasper de Vries    schedule 23.05.2017
comment
Большое спасибо за ваш ответ! К сожалению, я уже пытался решить проблему таким образом, установив имя с (name = "MyBean") (и только что попробовал еще раз), но все равно получаю ту же ошибку: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'MyBean' resolved to null - person scholt; 23.05.2017
comment
Я схожу с ума здесь. Я пытался поместить папку META-INF и содержащуюся в ней папку faces-config.xml во все мыслимые места, но ошибка осталась прежней. - person scholt; 23.05.2017