簡體   English   中英

不同項目中的Bean接口和Bean實現

[英]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.

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