如何在WildFly上禁用WELD

11

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

异常0: javax.enterprise.inject.UnsatisfiedResolutionException:无法解析带有合格名[@javax.enterprise.inject.Any(),@javax.enterprise.inject.Default()]的“ org.springframework.data.mongodb.core.MongoOperations”的bean。 at org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.createRepositoryBean(MongoRepositoryExtension.java:104) at org.springframework.data.mongodb.repository.cdi.MongoRepositoryExtension.afterBeanDiscovery(MongoRepositoryExtension.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266) at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:125) at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253) at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232) at 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>

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

3个回答

18

这里有一个标准的方式:

<?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标准的版本,很多人在未来几周会遇到这个问题。 - John Ament
是的,我也同意这是一个更好的解决方案 :) - Petr Mensik
7
请注意,上述XML应保存为WEB-INF/beans.xml(适用于war文件)或META-INF/beans.xml(适用于jar文件)。 - seanf
1
这将禁用bean扫描,但OP的问题是如何禁用weld...所以我认为这并没有完全回答问题。然而,也许OP只是问错了问题 :) - Stijn de Witt

16

选项1: 在war中使用jboss-all.xml

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

保存为WEB-INF/jboss-all.xml用于wars,否则保存为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

另一种无需更改应用程序本身的选择是配置Weld子系统以不将随机JAR视为CDI库。 只需编辑WildFly的standalone.xml中Weld的配置,使其如下所示:

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

1
选项1是正确的选择 :) https://docs.jboss.org/author/display/WFLY8/CDI+Reference - SWoeste
2
只是为了补充之前(正确的)答案的细节:对于 ear 包,jboss-all.xml 文件必须位于 ear 的 META-INF 文件夹中。 - Luca Buraggi

5

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接