簡體   English   中英

Wildfly和Wildfly-swarm從戰爭部署與自定義模塊中注入CDI bean

[英]Wildfly and Wildfly-swarm injecting CDI beans from war deployment vs custom module

在試驗Wildfly-swarm的過程中,我遇到了有關豆類注射的奇怪情況。

我有一個非常簡單的bean,或多或少是這樣的:

@ApplicationScoped
public class FooServiceImpl implements FooService {
    Foo delegate;
    @PostConstruct public void init() {
        delegate = .....;
    }

    public Foo getFoo() {
        return delegate;
    }
}

如果我在戰爭部署中直接將其捆綁在一個罐子中,那么一切都會按預期進行。 但是,我需要將此實現的內部部分與應用程序完全隔離,為什么我將服務api及其實現打包到單獨的jboss模塊中。

這些模塊已添加到群uberJar中,我的應用通過MANIFEST Dependencies條目依賴於它們。 現在,一切似乎都正常,將FooService bean注入了我的應用程序servlet / rest資源中,但未調用init()方法。

我不知道這是怎么回事。 就像bean解析過程無法識別@ApplicationScope注釋一樣。 可以有兩個不同的類加載器嗎?

更新

我啟用了跟蹤,在我看來,Weld正在將FooImpl類視為ApplicationScoped, LifecycleMixin.lifecycle_mixin_$$_postConstruct()到要創建的代理中:

2017-09-14 23:11:34,315 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001538: Created context instance for bean Managed Bean [class com.xxx.FooImpl] with qualifiers [@Any @Default] identified as WELD%ManagedBean%test.war|test.war.external.file:/tmp/nestedjarloader2449602760983533131.tmp/META-INF/beans.xml|com.xxx.FooImpl|null|false
2017-09-14 23:11:34,315 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001542: Retrieving/generating proxy class com.xxx.FooImpl$Proxy$_$$_WeldClientProxy
2017-09-14 23:11:34,315 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public void com.xxx.FooImpl.registerMessageHandler(com.xxx.MessageHandler)
2017-09-14 23:11:34,315 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public void com.xxx.FooImpl.registerListeners(java.util.EventListener[])
2017-09-14 23:11:34,316 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public void com.xxx.FooImpl.send(com.xxx.MessageHandler,com.xxx.Message) throws java.io.IOException
2017-09-14 23:11:34,316 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public void com.xxx.FooImpl.init()
2017-09-14 23:11:34,316 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public java.lang.String java.lang.Object.toString()
2017-09-14 23:11:34,316 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public abstract void org.jboss.weld.interceptor.proxy.LifecycleMixin.lifecycle_mixin_$$_postConstruct()
2017-09-14 23:11:34,316 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001541: Adding method to proxy: public abstract void org.jboss.weld.interceptor.proxy.LifecycleMixin.lifecycle_mixin_$$_preDestroy()
2017-09-14 23:11:34,317 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001543: Created Proxy class of type class com.xxx.FooImpl$Proxy$_$$_WeldClientProxy supporting interfaces [interface com.xxx.FooService, interface java.io.Serializable, interface org.jboss.weld.interceptor.proxy.LifecycleMixin, interface org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy, interface org.jboss.weld.bean.proxy.ProxyObject]
2017-09-14 23:11:34,317 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001506: Created new client proxy of type class com.xxx.FooImpl$Proxy$_$$_WeldClientProxy for bean Managed Bean [class com.xxx.FooImpl] with qualifiers [@Any @Default] with ID WELD%ManagedBean%test.war|test.war.external.file:/tmp/nestedjarloader2449602760983533131.tmp/META-INF/beans.xml|com.xxx.FooImpl|null|false
2017-09-14 23:11:34,318 TRACE [org.jboss.weld.Bean] (ServerService Thread Pool -- 12) WELD-001507: Located client proxy of type class com.xxx.FooImpl$Proxy$_$$_WeldClientProxy for bean Managed Bean [class com.xxx.FooImpl] with qualifiers [@Any @Default]

沒有調用postconstruct攔截器-為什么呢? 謎底加深!

更新2

在香草野生蠅上進行了測試,其行為相同,如果bean位於模塊中,則不會調用@PostConstruct方法。

我想這個問題和JBoss論壇的一個問題是有聯系的,但是如果沒有的話……

可能的原因是您的單獨模塊未聲明對 @PostConstruct來源的<module name="javax.annotation.api"/>依賴 添加它,應該解決麻煩。 這似乎是預期的JVM行為( 如該SO問題中所述 )-如果您在運行時錯過了依賴項,則程序仍將執行但忽略注釋。

作為解決此問題的一種方法(如果上述方法不起作用或您無法做到)-您可以使用初始化方法。 這是CDI創建對象后立即執行的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM