WELD-001201:加载 beans.xml + Tomcat 7.0.59 时出错

WELD-001201: Error loading beans.xml + Tomcat 7.0.59

我有一个应用程序将 CDI 与 weld 2.2.9.Final 和嵌入式 Tomcat 7.0.57 结合使用,一切正常。 升级到嵌入式 Tomcat 7.0.59 后,当我启动我的应用程序时出现以下异常:

    Caused by: org.jboss.weld.exceptions.IllegalStateException: WELD-001201: Error loading beans.xml jndi:/localhost/WEB-INF/beans.xml
at org.jboss.weld.xml.BeansXmlParser.parse(BeansXmlParser.java:124)
at org.jboss.weld.bootstrap.WeldBootstrap.parse(WeldBootstrap.java:131)
at org.jboss.weld.environment.servlet.deployment.WebAppBeanArchiveScanner.scan(WebAppBeanArchiveScanner.java:78)
at org.jboss.weld.environment.deployment.discovery.AbstractDiscoveryStrategy.performDiscovery(AbstractDiscoveryStrategy.java:83)
at org.jboss.weld.environment.servlet.WeldServletLifecycle.createDeployment(WeldServletLifecycle.java:230)
at org.jboss.weld.environment.servlet.WeldServletLifecycle.initialize(WeldServletLifecycle.java:120)
at org.jboss.weld.environment.servlet.EnhancedListener.onStartup(EnhancedListener.java:61)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5513)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 6 more
    Caused by: java.io.FileNotFoundException: jndi:/localhost/WEB-INF/beans.xml
at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:384)
at java.net.URL.openStream(URL.java:1037)
at org.jboss.weld.xml.BeansXmlParser.parse(BeansXmlParser.java:101)
... 14 more

问题是java.io.FileNotFoundException:jndi:/localhost/WEB-INF/beans.xml

我今天刚遇到类似的事情。找不到该文件,或者您正试图通过 ENTITY 声明从 web.xml 中包含它。如果您尝试使用 ENTITY 声明加载 beans.xml,那么问题是由 Tomcat 7.0.59 中的新安全策略引起的——阻止加载外部实体现在是默认设置。上下文参数 xmlBlockExternal 现在默认设置为 "true"。

您必须在您的上下文中覆盖它:~Tomcat/conf/context.xml 中的主上下文或您的应用程序级上下文文件中。要覆盖,请像这样添加参数:

        <Context xmlBlockExternal="false">