[英]Bean interface and Bean implementation in different projects
是否可以在一個項目中有一個bean接口,並在另一個項目中實現該bean的實現,而另一個項目中包含以前的項目作為依賴項?
我有以下界面:
package com.proj1.util;
import .....;
public interface Notification {
addNotification();
addError();
}
在同一項目(即Proj1)中,我還有以下課程:
package com.proj1.util.exception;
import .....;
public class ExceptionHandler extends RuntimeException ... {
private String errorMessage;
@Override
public void handle() {
Util.getBeanInstance(Notification.class).addError(errorMessage);
}
}
現在在第二個項目中,我具有Notification
的實際實現,如下所示:
package com.proj2.beans;
@Named
@ConversationScoped
public class NotificationBean implements Notification, Serializable {
private static final long serialVersionUID = 1L;
...
}
這種情況導致Tomcat中出現異常,並顯示消息“ 當前線程中不存在帶有作用域類型注釋@ConversationScoped的WebBeans上下文 ”
我的建議是添加一個生產我的NotificationBean的Factory,但它似乎變化不大。
package com.proj2.beans.cdi;
import javax.enterprise.inject.New;
import javax.enterprise.inject.Produces;
import com.proj1.util.Notification;
public class NotificationBeanFactory {
@Produces
public Notification create(@New NotificationBean notificationBean) {
return notificationBean;
}
}
問題是我如何在一個只有bean接口的項目中使用bean,而bean的實現卻在另一個項目中。 可能嗎?
異常表明沒有正在運行的對話,因此我將從確定何時嘗試使用@ConversationScoped
bean以及從哪個類開始。
您的代碼段表明ExceptionHandler
類調用了一個神奇的公式,而我們對此一無所知:
Util.getBeanInstance(Notification.class).add(...);
在沒有活動對話的情況下嘗試使用此功能可能會導致您看到異常。 因此,您可以將@Inject ExceptionHandler
注入NotificationBean
以便僅在進行活動對話時使用它。
至於在不同項目中關於界面和隱含的焊接問題; 有可能的。 在您的proj2
Weld會簡單地標識一個bean NotificationBean
並且在它的類型中還會有Notification
因此您可以@Inject Notification
。 但是,它可能無法正常工作-在proj1
您無法@Inject Notification
因為proj1
本身沒有任何可實現該接口的bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.