【发布时间】:2016-06-14 16:22:07
【问题描述】:
是否可以在一个项目中拥有一个 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 中出现异常,并显示消息“WebBeans context with scope type annotation @ConversationScoped does not exist within current thread”
我的建议是添加一个工厂来生成我的 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 实现在另一个项目中。有可能吗?
【问题讨论】:
-
异常表明有问题的线程(尝试获取 bean 的线程)不是 HTTP 请求线程。换言之,HTTP 会话和 HTTP 会话等 HTTP 相关范围不可用。这是真的?那为什么是
@ConversationScoped呢?您究竟希望容器在哪里存储实际的 bean 实例? -
这是一个 JSF 应用程序,请求是从浏览器发出的,所以它是一个 HTTP 请求。虽然可能是因为还没有开始对话。
NotificationBean实际上应该管理我所有应用程序的消息(错误、警告等)。将其设置为会话范围会更明智吗?
标签: java jakarta-ee cdi jboss-weld