FacesContext не внедряется в Wildfly 14 с JSF 2.3 (Mojarra, основной модуль)

У меня есть боб:

import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;

...

@Named
@ViewScoped
public class SimpleBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Inject
    protected FacesContext facesContext;

    ...
}

Согласно с

https://arjan-tijms.omnifaces.org/p/jsf-23.html#1316

это должно работать с 2.3 ...

При развертывании в Wildfly 14 это приводит к следующему:

13:02:33,516 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 72) HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect
13:02:33,563 INFO  [org.hibernate.envers.boot.internal.EnversServiceImpl] (ServerService Thread Pool -- 72) Envers integration enabled? : true
13:02:34,344 INFO  [org.hibernate.hql.internal.QueryTranslatorFactoryInitiator] (ServerService Thread Pool -- 72) HHH000397: Using ASTQueryTranslatorFactory
13:02:34,531 WARN  [org.jboss.weld.Bootstrap] (MSC service thread 1-1) WELD-000146: BeforeBeanDiscovery.addAnnotatedType(AnnotatedType<?>) used for class com.sun.faces.flow.FlowDiscoveryCDIHelper is deprecated from CDI 1.1!
13:02:34,918 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.deployment.unit."auth-portal.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."auth-portal.war".WeldStartService: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1728)
    at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1556)
    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type FacesContext with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject protected com.company.project.view.SimpleBean.facesContext
  at com.company.project.view.SimpleBean.facesContext(SimpleBean.java:0)

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:143)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at org.jboss.threads.JBossThread.run(JBossThread.java:485)

13:02:34,918 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "auth-portal.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"auth-portal.war\".WeldStartService" => "Failed to start service
    Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type FacesContext with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject protected com.company.project.view.SimpleBean.facesContext
  at com.company.project.view.SimpleBean.facesContext(SimpleBean.java:0)
"}}

Мои лица-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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_3.xsd"
              version="2.3">
    ...

ВОПРОС:

Что здесь не так и как вы решаете это?

Кстати, ответ здесь не решил проблему: Как внедрить FacesContext с помощью JSF 2.3 и TomEE?


person Kawu    schedule 06.11.2018    source источник
comment
Из коробки ничего не отображается, только 13:49:20,809 INFO [org.jboss.as.jsf] (ServerService Thread Pool -- 55) WFLYJSF0007: Activated the following JSF Implementations: [main]. Однако при использовании выражений JSF Version = #{facesContext.class.package.implementationTitle} #{facesContext.class.package.implementationVersion} в одном из XHTML отображается строка JSF Version = Mojarra 2.3.5.SP2.   -  person Kawu    schedule 06.11.2018


Ответы (1)


Согласно с

https://github.com/javaserverfaces/mojarra#activating-cdi-in-jsf-23

это ответ:

По умолчанию JSF 2.3 будет работать в режиме JSF 2.2 в отношении поддержки CDI. Даже если вы используете файл faces-config.xml, совместимый с JSF 2.3. Другими словами, новая функция JSF 2.3 для внедрения и разрешения EL артефактов JSF (spec issue 1316) не будет работать, пока вы явно не активируете это. Другими словами, @Inject FacesContext по умолчанию не работает. Это необходимо для полной обратной совместимости JSF 2.3.

В настоящее время существует только один способ активировать CDI в JSF 2.3 и при этом заставить JSF 2.3 работать в полном режиме JSF 2.3. Поместите аннотацию @FacesConfig на произвольный управляемый компонент CDI. Например, общий компонент запуска/конфигурации.

@FacesConfig
@ApplicationScoped
public class YourApplicationConfig {
    // ...
}

Полный пример:

import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;

@FacesConfig
@ApplicationScoped
public class Jsf23Activator {
    // ...
}

Вам нужна аннотация @ApplicationScoped, иначе она не будет работать. После этого в моем запуске консоль наконец отображает:

14:23:28,805 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 82) Initializing Mojarra 2.3.5.SP2 for context '/blah'
14:23:30,415 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 82) Monitoring file:/C:/dev/servers/wildfly-14.0.1.Final/standalone/deployments/blah.war/WEB-INF/faces-config.xml for modifications
person Kawu    schedule 06.11.2018
comment
Хитрость здесь в том, что отсутствует @ApplicationScoped... без него ничего не происходит. - person Kawu; 06.11.2018
comment
Как упоминалось здесь: stackoverflow.com/questions/45682309/ - person Kukeltje; 06.11.2018
comment
Ага. И из того, что я пробовал, вам не нужны дополнительные version = FacesConfig.Version.JSF_2_3. - person Kawu; 08.11.2018