Maven - JSF 2.0 не работает на встроенном коте

Я создал веб-приложение Maven, используя зависимости JSF 2.2, Primefaces, Tomcat 7.

Моя реализация JSF - Mojarra 2.2.4, я добавил эти зависимости в свой POM:

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

Но, к сожалению, у меня проблема с tomcat7-maven-plugin и его встроенным котом. Если я использую команду tomcat7:run, мое веб-приложение запускается без проблем, но когда оно пытается загрузить управляемый компонент, я получаю эту ошибку:

Цель недоступна, идентификатор testBean разрешен до нуля

Это признак того, что веб-приложение использует JSF 1.x вместо JSF 2.x. Конфигуратор JSF 1.x не распознает аннотации @ManagedBean, из-за чего они не загружаются/инициализируются автоматически без необходимости использования Faces-config.xml.

Я использую встроенный tomcat 7.0.50, настроенный с его помощью: http://tomcat.apache.org/maven-plugin-trunk/tomcat7-maven-plugin/adjust-embedded-tomcat-version.html

Но, несмотря на то, что я не распознаю аннотации @ManagedBean, он работает только с использованием тега managebean на faces-config.xml.

Есть ли способ включить поддержку JSF 2.x в Tomcat Embedded для maven7-tomcat-plugin?

PS: tomcat7:run-war работает, но мне не нравится, потому что, очевидно, это статический запуск без какой-либо возможности изменить код xhtml (например) на лету.


person giaffa86    schedule 10.02.2014    source источник
comment
Я не понимаю проблемы. JSF развернут с вашим приложением, не так ли?   -  person Gimby    schedule 10.02.2014
comment
Это так, у меня есть зависимости JSF от моего POM, но проблема в Maven Tomcat Embedded. Он не распознает JSF 2.X. На самом деле, если я соберу WAR и разверну его на внешнем Tomcat, веб-приложение будет работать.   -  person giaffa86    schedule 10.02.2014
comment
Кстати, интересная причина вечного Target Unreachable, идентификатор [beanname] преобразован в null. Ранее я видел вопросы об этой проблеме без очевидной причины. Интересно, что здесь делает Maven+Embedded-Tomcat.   -  person BalusC    schedule 10.02.2014
comment
BalusC меня не пугает. Есть ли способ настроить maven-embedded-tomcat? Я не хочу каждый раз развертывать свою войну на сервере.   -  person giaffa86    schedule 10.02.2014
comment
Я хочу сказать, что веб-приложение НЕ МОЖЕТ использовать JSF 1.x, потому что вы развертываете JSF 2.x. Это не волшебным образом меняется на другой набор банок, которых даже нет. В настоящее время я предполагаю, что аннотации на самом деле не обрабатываются, возможно, в целом, а не только аннотации JSF 2.x.   -  person Gimby    schedule 10.02.2014
comment
Хорошо, должно быть так, как вы сказали. В таком случае, как я могу это решить? Я помню, что у меня проблемы, только если я использую maven-embedded-tomcat.   -  person giaffa86    schedule 10.02.2014
comment
Прежде всего докажите, что то, что я говорю, действительно верно. Если я могу напомнить вам, вам нужно решить это. Не начинайте делать предположения, что ответ ДОЛЖЕН исходить из этой темы. Единственное, что я могу сделать, это помочь вам найти темы для дальнейших исследований.   -  person Gimby    schedule 10.02.2014
comment
Спасибо за помощь, но мне нужно понять, что мне искать. Я не могу проводить дальнейшие исследования, если я не сосредоточен на проблеме. Может быть, Вы имеете в виду что-то в этом роде? stackoverflow.com/questions/4941355 /   -  person giaffa86    schedule 10.02.2014
comment
Проблема заключается в эффекте плагина (он не запускает веб-приложение в WAR или каталоге), алгоритм сканирования аннотаций работает неправильно. Если вы используете MyFaces, попробуйте установить параметр org.apache.myfaces.annotation.SCAN_PACKAGES, чтобы указать алгоритм сканирования выбранных пакетов.   -  person lu4242    schedule 10.02.2014
comment
Я использую Мохарру 2.2. Куда вы поместите это имущество? В файле face-config? Есть ли подобное правило для Мохарры?   -  person giaffa86    schedule 10.02.2014
comment
Я лучше указал реализацию моего JSF по этому вопросу.   -  person giaffa86    schedule 10.02.2014
comment
Это параметр, который вы должны указать в файле web.xml. Я не знаю подробностей Mojarra, но я полагаю, что существует аналогичный параметр, но я не знаю, будет ли он работать, потому что нам нужно было сделать некоторые специальные вещи, чтобы заставить его работать давным-давно, отличный от алгоритма по умолчанию предложено спец. Что я могу вам сказать, так это то, что параметр был добавлен в MyFaces именно для исправления этих ситуаций. Переключиться на MyFaces легко, и это сделает вашу жизнь проще. Попробуйте артефакты 2.2.0.   -  person lu4242    schedule 11.02.2014
comment
Хорошо, я переключился на MyFaces и добавил алгоритм сканирования аннотаций в свой web.xml. Теперь это работает отлично! Спасибо lu4242!   -  person giaffa86    schedule 11.02.2014


Ответы (1)


Я решил перейти с Mojarra 2.2.4 на MyFaces 2.2.0, выполнив следующие действия:

  1. удалить зависимости Mojarra в моем POM
  2. добавить зависимости MyFaces в мой POM:

    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
  3. изменить класс слушателя в моем web.xml

    <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    

  4. add context-param on my web.xml

    <context-param>
         <description>Defines which packages to scan for beans, separated by commas.
             Useful for when using maven and jetty:run (version 6) or tomcat:run
        </description>
        <param-name>org.apache.myfaces.annotation.SCAN_PACKAGES</param-name>
        <param-value>eu.dedalus</param-value>
    

.5 remove jsf-api e jsf-impl from WEB-INF/lib.

.6 [ECLIPSE ONLY] добавьте библиотеки myfaces.api и myfaces-impl в путь сборки, используя переменную M2REPO, и удалите библиотеки jsf-api и jsf-impl.

Спасибо https://stackoverflow.com/users/814956/lu4242!

person giaffa86    schedule 11.02.2014
comment
Я знаю, что вы давно решили проблему, но я нашел быстрое решение, используя плагин Jetty вместо Tomcat. - person Leonardo; 06.11.2014