如何在 WildFly 上禁用 WELD

Posted

技术标签:

【中文标题】如何在 WildFly 上禁用 WELD【英文标题】:How to disable WELD on WildFly 【发布时间】:2014-03-12 11:26:54 【问题描述】:

如何在 WildFly 上完全禁用 WELD。我不需要它,因为我使用了另一个 DI 框架。

异常 0: javax.enterprise.inject.UnsatisfiedResolutionException:无法使用限定符 [@javax.enterprise.inject.Any(), @javax.enterprise.inject.Default( )]。 在 org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.createRepositoryBean(MongoRepositoryExtension.java:104) 在 org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.afterBeanDiscovery(MongoRepositoryExtension.java:79) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93) 在 org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266) 在 org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:125) 在 org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253) 在 org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232) 在 org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)

我试过了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:weld="http://jboss.org/schema/weld/beans"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd
                       http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd
http://jboss.org/schema/weld/beans ">

<weld:scan>
    <weld:exclude name="com.google.**"/>
    <weld:exclude name="org.springframework.data.mongodb.**"/>
</weld:scan>

但这并没有解决我的问题。

【问题讨论】:

【参考方案1】:

有标准的方法:

<?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"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                       http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   version="1.1" bean-discovery-mode="none">
</beans>

【讨论】:

这是更合适的答案,并且不是特定于应用服务器的。我担心随着越来越多的应用服务器推出符合 EE 7 标准,许多人将在未来几周内面临这个问题。 是的,即使我同意这是一个更好的解决方案:) 请注意,上面的 XML 对于war文件应该保存为WEB-INF/beans.xml,对于jar文件应该保存为META-INF/beans.xml 这会禁用 bean 扫描,是的,但是 OP 的问题是如何 禁用焊接...所以这并不能完全回答我认为的问题。但是,也许 OP 只是提出了错误的问题 :)【参考方案2】:

选项1:战争中的jboss-all.xml

这是 Weld 特有的,但它会禁用 Weld 对整个部署的自动 bean 扫描(例如,war 文件和其中的所有 jar)。当您无法轻松地将beans.xml 添加到第三方 jar(例如 jboss-seam-resteasy.jar)时,这很方便。

战争时保存为WEB-INF/jboss-all.xml,否则保存为META-INF/jboss-all.xml

<jboss xmlns="urn:jboss:1.0">
    <weld xmlns="urn:jboss:weld:1.0" require-bean-descriptor="true"/>
</jboss>

见Per-deployment configuration。

选项 2:WildFly 中的standalone.xml

另一个不需要更改应用程序本身的选项是configure the weld subsystem not to treat random jars as CDI libraries。只需编辑 WildFly 的 standalone.xml 中的焊接配置,如下所示:

<subsystem xmlns="urn:jboss:domain:weld:2.0" require-bean-descriptor="true"/>

【讨论】:

选项 1 是要走的路 :) docs.jboss.org/author/display/WFLY8/CDI+Reference 只需将此详细信息添加到上一个(正确)答案中:对于 ear 包,jboss-all.xml 文件必须位于 ear META-INF 文件夹中。【参考方案3】:

尝试在$JBOSS_HOME/standalone/configuration/standalone.xml 开头的扩展列表中删除或注释掉org.jboss.as.weld 扩展。您可能还想从&lt;profile&gt; 中删除&lt;subsystem xmlns="urn:jboss:domain:weld:1.0"/&gt;。这会导致服务器上部署的所有应用程序都禁用 Weld。

【讨论】:

您也可以使用 CLI 命令删除子系统。 $JBOSS_HOME/bin/jboss-cli.sh -c "/subsystem=weld:remove".

以上是关于如何在 WildFly 上禁用 WELD的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 Wildfly 9.0.2 尝试序列化集群应用程序中的某些类

无法将 JSF + CDI 项目从 Tomcat 迁移到 Wildfly

Wildfly 11 部署中源自 deltaspike 的拦截器警告

如何在Wildfly 8.2.0中的server.log文件中禁用日志记录应用程序日志

如何从 Wildfly 中删除 KeyCloak?

集群 Wildfly 抛出 java.lang.IllegalAccessError