OWB 2.0.27,TomEE 8.0.14,JSF(myfaces)2.3.10启动错误



我们正在将Web应用程序升级到JSF 2.3.10、OWB 2.0.22和TomEE 8.0.14。我意识到我们应该搬到雅加达EE,但目前,这是我们的技术堆栈。

我在catalina日志中看到了与默认限定符有关的堆栈争用。一个片段:

原因:javax.enterprise.inject.spi.DeploymentException:无法启动owb上下文在org.apache.openejb.cdi.ThreadSingle ServiceImpl.initialize(ThreadSingle Serviceimpl.java:263)网址:org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:43)网址:org.apache.openejb.assembler.classic.assembler.createApplication(assembler.java:974)网址:org.apache.openejb.assembler.classic.assembler.createApplication(assembler.java:762)网址:org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1340)43个由以下原因引起:org.apache.openjb.OpenEJBRuntimeException:org.apache.webbeans.exception.WebBeansDeploymentException:javax.enterprise.inject.UnsisfiedResolutionException:找不到带有限定符的Api类型[com.inovis.catalog.ui.hierarchy.SelcodeList]限定符:[@javax.enterprise.inject.Default()]对于注入到Field injection Point,字段名称:selcodeList,Bean所有者:[SearchAction,WebBeansType:MANAGED,名称:SearchAction,API类型:[java.io.Serializable,com.inovis.contolog.ui.search.SearchAction,com.inovis.contolog.ui.BaseAction,java.lang.Object],限定符:[javax.enterprise.inject.Default,javax.enter进取.inject.Any,javax.inject.Named,javax.faces.annotation.FacesConfig]]网址:org.apache.openjb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:200)在org.apache.openejb.cdi.ThreadSingle ServiceImpl.initialize(ThreadSingle Serviceimpl.java:261)47个以上由以下原因引起:org.apache.webbeans.exception.WebBeansDeploymentException:javax.enterprise.inject.UnsisfiedResolutionException:找不到具有限定符的Api类型[com.inovis.catalog.ui.hierarchy.SelcodeList]限定符:[@javax.enterprise.inject.Default()]对于注入到Field injection Point,字段名称:selcodeList,Bean所有者:[SearchAction,WebBeansType:MANAGED,名称:SearchAction,API类型:[java.io.Serializable,com.inovis.contolog.ui.search.SearchAction,com.inovis.contolog.ui.BaseAction,java.lang.Object],限定符:[javax.enterprise.inject.Default,javax.enter进取.inject.Any,javax.inject.Named,javax.faces.annotation.FacesConfig]]网址:org.apache.webbeans.config.BeansDeployer.deploy(BeansDepleyer.java:398)网址:org.apache.openjb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:196)48个以上由以下原因引起:javax.enterprise.inject.UnsisfiedResolutionException:找不到具有限定符的Api类型[com.inovis.catalog.ui.hierarchy.SelcodeList]限定符:[@javax.enterprise.inject.Default()]对于注入到Field injection Point,字段名称:selcodeList,Bean所有者:[SearchAction,WebBeansType:MANAGED,名称:SearchAction,API类型:[java.io.Serializable,com.inovis.contolog.ui.search.SearchAction,com.inovis.contolog.ui.BaseAction,java.lang.Object],限定符:[javax.enterprise.inject.Default,javax.enter进取.inject.Any,javax.inject.Named,javax.faces.annotation.FacesConfig]]网址:org.apache.webbeans.util.InpjectionExceptionUtilthrowUnsatisfiedResolutionException(InjectionExcessionUtil.java:60)网址:org.apache.webbeans.contacter.InjectionResolver.checkInjectionPoint(InjectionSolutionr.java:252)网址:org.apache.webbeans.contacter.BeanManageImpl.validate(BeanManageImpl.java:1231)网址:org.apache.webbeans.util.WebBeansUtil.validate(WebBeansUti.java:1521)网址:org.apache.webbeans.config.BeansDeployer.validate(BeansDepleyer.java:1220)网址:org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDepleyer.java:1131)网址:org.apache.webbeans.config.BeansDeploye.deploy(BeansDepleyer.java:323)49更多

我在StackOverflow上看了几个博客和许多关于配置OWB2、Tomcat(TomEE+)和JSF2.3的问题/答案。包括:https://hantsy.gitbook.io/java-ee-8-by-example/jsf/jsf-activation

Apache OpenWebBeans(CDI)+Servlet,注入不起作用

https://devlearnings.wordpress.com/2011/05/15/apache-openwebbeans-cdi-from-standalone-to-webapp

OpenWebBeans+MyFaces+Tomcat=IllegalStateException

我还在批处理文件中的TomEE/lib目录中添加了基于此网站的额外依赖项:https://lists.apache.org/thread/wct0r81bvsdbo7jbyqmw3x3d90h8s9jr

我的配置:

/META_INF/context.xml(由于org.apache.tome.catalina.TomcatResourceFactory.create无法创建资源null->java.lang.IollegalStateException:在没有初始化上下文或类加载器映射已部署应用程序的线程上)

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--    <Resource name="BeanManager"-->
<!--              auth="Container"-->
<!--              type="javax.enterprise.inject.spi.BeanManager"-->
<!--              factory="org.apache.webbeans.container.ManagerObjectFactory"/>-->
</Context>

/WEB-INF/beans.xml

<beans 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/beans_2_0.xsd"
bean-discovery-mode="annotated"
version="2.0">
</beans>

/WEB-INF/WEB.xml(摘录)

<context-param>
<param-name>org.apache.myfaces.RENDER_VIEWSTATE_ID</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<resource-env-ref>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
</listener>
<!--jsf-->
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

我们的bean及其注入的类的片段:

@FacesConfig(version=FacesConfig.Version.JSF_2_3)
@Default
@Named("selcodeList")
@SessionScope
public class SelcodeList extends BaseListAction implements Serializable {
@FacesConfig(version=FacesConfig.Version.JSF_2_3)
@Default
@Named("searchAction")
@SessionScoped
public class SearchAction extends BaseAction {
@Inject
private SelcodeList selcodeList;

我甚至添加了一个ConfigurationBean:

import javax.faces.annotation.FacesConfig;
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class ConfigurationBean {
}

所以,我怀疑这是一个配置错误,但我不确定在哪里。然而,根据以上参考资料,一切似乎都井然有序。还有什么原因会导致限定符错误?

其次,显式添加@Default注释似乎有助于解决其他类似的错误。我以为CDIBean中隐含了注释?

谢谢你在这方面的帮助。

  1. beans.xml文件中的bean-discovery-mode="annotated"更改为bean-discovery-mode="all"
  2. SelcodeListSearchAction中删除@FacesConfig(version = FacesConfig.Version.JSF_2_3)@Default
  3. @ApplicationScoped添加到ConfigurationBean
  4. implements Serializable添加到SearchActionbean
  5. 从TomEE/lib目录中删除额外的Apache OpenWebBeans依赖项,不要删除Apache TomEE提供的库

最新更新