gpt4 book ai didi

java - 不同项目中的Bean接口(interface)和Bean实现

转载 作者:行者123 更新时间:2023-12-01 09:48:08 29 4
gpt4 key购买 nike

是否可以在一个项目中拥有一个 bean 接口(interface),并在另一个包含前一个项目作为依赖项的项目中实现该 bean?

我有以下界面:

package com.proj1.util;
import .....;

public interface Notification {

addNotification();
addError();

}

在同一个项目(即 Proj1)中,我还有以下类(class):

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,但它似乎没有太大变化。

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;
}
}

问题是如何在一个只有接口(interface)的项目中使用 bean,而 bean 实现位于另一个项目中。可能吗?

最佳答案

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

您的代码片段表明 ExceptionHandler 类调用了一个我们对此一无所知的神奇公式:

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

在没有 Activity 对话时尝试使用此功能可能会导致您看到的异常。因此,您可以将 @Inject ExceptionHandler 注入(inject)到 NotificationBean 中,这样您就只能在 Activity 对话时使用它。

关于不同项目中接口(interface)和impl的Weld问题;有可能的。在您的 proj2 Weld 中将简单地识别一个 bean NotificationBean 并且在它的类型中也会有 Notification 因此您可以 @Inject Notification 。但反过来它可能无法工作 - 在 proj1 中你不能 @InjectNotification 因为 proj1 本身没有任何可以实现该功能的 bean界面。

关于java - 不同项目中的Bean接口(interface)和Bean实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817373/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com