2016-06-14 41 views
0

在一个项目中是否有可能拥有一个bean接口,并且在另一个项目中实现了该bean,该项目中包含之前的项目作为依赖关系?不同项目中的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; 

    ... 
} 

这种情况导致e xception在Tomcat中消息“WebBeans的背景与范围类型注释@ConversationScoped并不当前线程中存在”

我的建议是增加产生我NotificationBean一个工厂,但它似乎并没有太大的变化。

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实现在另一个项目中。可能吗?

+0

异常表明所讨论的线程(尝试获取bean的线程)不是HTTP请求线程。换句话说,HTTP相关的范围如HTTP会话和HTTP会话不可用。这是真的?那为什么呢'@ ConversationScoped'呢?你究竟在哪里预期容器存储实际的bean实例? – BalusC

+0

这是一个JSF应用程序,请求来自浏览器,因此它是一个HTTP请求。虽然可能是因为没有对话还没有开始。 'NotificationBean'实际上应该管理我的所有应用程序的消息(错误,警告等)。使会话范围更明智吗? –

回答

1

例外情况表明,没有正在运行的对话,因此我将首先确定何时尝试使用@ConversationScoped bean以及来自哪个类。

你的代码片段表明,ExceptionHandler类调​​用一个神奇的公式,我们不知道任何关于:

Util.getBeanInstance(Notification.class).add(...); 

尝试使用此当没有活跃的对话可能会导致你看到异常。因此,您可以将@Inject ExceptionHandler转换为NotificationBean,以便您只有在有活动的对话时才使用它。

至于在不同项目中关于接口和impl的焊接问题;有可能的。在你的proj2焊接将简单地识别一个豆NotificationBean和其中的类型,也将有Notification因此,你可以然后@Inject Notification。 虽然它可能不会工作 - 但在proj1中,您不能@Inject Notification,因为proj1本身没有任何可以实现该接口的bean。

+0

'Util.getBeanInstance(...)'是我使用BeanManager获取bean并返回请求的bean的一组实用方法。实际上,除非没有对话被打开,否则整个设计都是有效的。这正是发生这种情况的原因,因为我的应用程序在打开特定对话并尝试输出错误消息通知之前失败。 –

相关问题