Точки внедрения EJB и CDI в @FacesValidator и @FacesConverter не работают с помощью OmniFaces в более новых версиях JSF

я использовал,

  • Мохарра 2.3.0-m01
  • ОмниФейс 2.0.
  • Финал PrimeFaces 5.1
  • Расширение PrimeFaces 3.0.0
  • Сервер GlassFish 4.1

И другие артефакты Java EE.


Точки впрыска в @FacesValidator выглядят следующим образом:

@FacesValidator(value="testValidator")
public class TestValidator implements Validator {

    @Inject
    private DemoEJB ejb;

    @Inject
    private ManagedBean managedBean;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // Use the injected EJB and/or managed bean here.
    }
}

Эти точки внедрения остаются null (я явно не пытался внедрить EJB, но это не должно происходить так же хорошо, как управляемый компонент).


Поскольку вышеупомянутая версия Mojarra все еще доступна в виде моментального снимка, я попытался понизить ее до 2.2.10 с той же версией OmniFaces, что и 2.0 (в качестве альтернативы также пробовал с OmniFaces 2.1-SNAPSHOT — как на Mojarra 2.2.10, так и на 2.3. 0-m01 альтернативно) но безрезультатно.

Это сработало, когда я понизил версию Majarra до версии 2.2.8-02 (поочередно пробовал использовать OmniFaces 1.8.1, 2.0 и 2.1-SNAPSHOT). Я не пробовал другие версии Mojarra.

Была ли удалена поддержка создания @FacesValidator и @FacesConverter кандидатов для точек внедрения EJB и CDI с помощью OmniFaces (что, в свою очередь, не требует дополнительных зависимостей и/или конфигураций) для более новых версий Mojarra?

Я еще не пробовал явно в @FacesConverter только потому, что изменение такого количества библиотек попеременно так много раз с использованием ошибочной среды IDE NetBeans, которая по своей природе также очень медленно работает в Windows, заняло целый день от рассвета до заката.


РЕДАКТИРОВАТЬ :

Сервер выдает следующие предупреждения, связанные со сваркой.

WARN:   WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled
WARN:   WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.omnifaces.VetoAnnotatedTypeExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.omnifaces.VetoAnnotatedTypeExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.ApplicationProducer@b15a70 declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.ApplicationMapProducer@db0450 declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.ViewMapProducer@1c55365 declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.ExternalContextProducer@14b1a6 declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.FacesContextProducer@1048acb declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.
WARN:   WELD-001473: javax.enterprise.inject.spi.Bean implementation com.sun.faces.cdi.ViewProducer@275cfa declared a normal scope but does not implement javax.enterprise.inject.spi.PassivationCapable. It won't be possible to inject this bean into a bean with a passivating scope (@SessionScoped, @ConversationScoped). This can be fixed by assigning the Bean implementation a unique id by implementing the PassivationCapable interface.

person Tiny    schedule 05.04.2015    source источник
comment
У меня работает на Tomcat 8.0.18 + Mojarra 2.3.0-m01 (и 2.2.10) + Weld 2.2.9. У меня сейчас нет под рукой GF4.1, но с какой версией Weld он поставляется?   -  person BalusC    schedule 07.04.2015
comment
Версия Weld в GlassFish 4.1 — 2.2.2, как указано здесь и здесь. Хотя я не знаю, есть ли способ получить этот номер версии программно. GlassFish 4.1 также выдает некоторые предупреждения, связанные со сваркой. Я добавил их к вопросу.   -  person Tiny    schedule 07.04.2015
comment
Версия сварки регистрируется как INFO: WELD-000900. Я понизил его до 2.2.2 для Tomcat, но все еще не могу его воспроизвести. Стоит попробовать GF 4.1 позже. Эти предупреждения вряд ли связаны.   -  person BalusC    schedule 07.04.2015
comment
Он действительно зарегистрирован как Info: WELD-000900: 2.2.2 (Final) на терминале.   -  person Tiny    schedule 07.04.2015
comment
К вашему сведению, я установил и запустил GF 4.1, обновил входящий в комплект Mojarra 2.2.7 до версии 2.2.10 и провел тестовый проход на OmniFaces 2.1 (моментальный снимок) Showcase. Все работает отлично, включая внедрение CDI/EJB в @FacesConverter. Другими словами, я все еще не могу воспроизвести вашу проблему.   -  person BalusC    schedule 17.04.2015
comment
На этот раз я нахожусь в пустом проекте игровой площадки, который я создал заново с нуля, имея только один файл XHTML, управляемый компонент CDI (альтернативно @SessionScoped и @ViewScoped), один @FacesValidator, куда я ввел управляемый компонент CDI. Внедрение управляемого компонента не удалось в Mojarra 2.2.10, но удалось в Mojarra 2.2.8-02 (альтернативно). Я пробовал использовать OmniFaces 2.1 — SNAPSHOT. Короче говоря, я мог видеть точно такое же поведение после создания нового пустого проекта JSF с наименьшими возможными зависимостями и ресурсами.   -  person Tiny    schedule 17.04.2015
comment
Я также попытался внедрить управляемый компонент CDI в файл @FacesConverter. Произошло то же самое - точка инъекции удалась на Mojarra 2.2.8-02, но осталась null на Mojarra 2.2.10. Это стандартный проект NetBeans, в котором для развертывания приложения используется сценарий сборки Ant, а не инструмент сборки Maven, но это не должно быть причиной. В любом случае библиотека доступна по пути к классам. Сервер также регистрирует эту информацию на терминале - Info: Using OmniFaces version 2.1-SNAPSHOT.   -  person Tiny    schedule 17.04.2015
comment
Гоша. Я создал пустой проект игровой площадки и воспроизвел вашу проблему на GF 4.1. Затем я вспомнил этот связанный сегодня Q и я добавлен /WEB-INF/beans.xml (он уже присутствовал в витрине OmniFaces). Потом снова заработало. Это и для вас тоже?   -  person BalusC    schedule 17.04.2015
comment
Я создал beans.xml (/WEB-INF/beans.xml) с помощью bean-discovery-mode="annotated", но безрезультатно. Точка внедрения осталась null на Mojarra 2.2.10, как сказано выше (аккуратно развернул приложение с нуля).   -  person Tiny    schedule 17.04.2015
comment
Мой beans.xml был просто пуст. И да, annotated снова делает внедренный компонент null. Когда я изменил на all (кстати, по умолчанию), он снова работает. Это странно.   -  person BalusC    schedule 17.04.2015
comment
Да, установив bean-discovery-mode на all, точка внедрения заработала на Mojarra 2.2.10.   -  person Tiny    schedule 17.04.2015
comment
Воспроизведена та же проблема на WF 8.2 как с Mojarra 2.2.9, так и с 2.2.10, но не с Mojarra 2.2.8. Так что это, вероятно, связано с изменением в 2.2.9. Теперь еще разбираюсь какой..   -  person BalusC    schedule 17.04.2015


Ответы (1)


Это вызвано изменением в Mojarra 2.2.9. Он отлично работает в 2.2.8. Я воспроизвел это как в GlassFish 4.1, так и в WildFly 8.2. После сканирования всех проблем, перечисленных в примечаниях к выпуску 2.2.9, и связанные пакеты изменений, это, по-видимому, является следствием переноса issue 3552 в JSF 2.2. .Икс. Они внутренне отключили проверку возможности внедрения компонентов, поведений, валидаторов и преобразователей, которые неявно регистрировали их как кандидатов на управляемые компоненты CDI. Другими словами, в период с 2.2.x до 2.2.9 Mojarra непреднамеренно предлагал «родную» @Inject поддержку в упомянутых артефактах.

Чтобы внедрение в @FacesConverter и @FacesValidator в любом случае работало через OmniFaces, вам нужно добавить пустой /WEB-INF/beans.xml или хотя бы один с bean-discovery-mode, установленным на all вместо annotated.

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:weld="http://jboss.org/schema/weld/beans"
    bean-discovery-mode="all"
>
    <!-- ... -->
</beans>

Это уже значение по умолчанию, вы также можете просто опустить атрибут bean-discovery-mode.

Техническая разница заключается в том, что bean-discovery-mode="all" регистрирует все подходящие классы как управляемые компоненты CDI, тогда как bean-discovery-mode="annotated" регистрирует только классы с явной аннотацией области действия CDI, такой как @RequestScoped, как управляемые компоненты CDI, что, таким образом, приведет к ошибке для @FacesConverter и @FacesValidator. .

person BalusC    schedule 17.04.2015
comment
Подход JSF 2.3 требует дополнительного атрибута managed=true в аннотации класса, чтобы активировать его. См. также jdevelopment.nl/jsf-23. - person BalusC; 30.04.2015
comment
Обязательно ли использовать bean-discovery-mode=all. Разве это не сработает, если я отмечу Validator какой-нибудь аннотацией области действия? Будет ли работать @ RequestScoped или @ Dependent? - person guest; 03.11.2016
comment
@guest К сожалению, пометка компонента аннотацией, определяющей компонент, также не сработает. Вы можете понизить свои библиотеки JSF до версии, поддерживающей версию Mojarra, используя шаги, описанные в stackoverflow.com/questions/17085717/. Потому что bean-discovery-mode=все отстой. - person jpangamarca; 04.01.2017