- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人问过类似的问题,但没有完全解决我想做的事情。我们有一个基于 Seam 2.x 的旧应用程序,它带有我们正在转换为 CDI 的批处理作业框架。作业框架使用 Seam 上下文对象来发起对话。作业框架还加载一个特定于作业的数据持有者(基本上是一个 Map),然后可以通过 Seam Contexts 对象访问链下的任何服务,包括来自 SLSB 的数据持有者。其中一些服务可以更新 map ,以便作业状态可以更改并在记录之间进行检测。
看起来在 CDI 中,作业将 @Inject
一个 CDI 对话对象,并手动开始/结束对话。我们还将定义一个新的 ConversationScoped
bean 来保存 Map (MapBean
)。我不清楚的是两件事:
首先,作业还需要@Inject MapBean
,以便它可以在调用 Conversation.begin() 方法之前加载特定于作业的数据。容器会知道将此实例传递给调用链中的服务吗?
相关的,根据这个问题Is it possible to @Inject a @RequestScoped bean into a @Stateless EJB?应该可以将 ConservationScoped
bean 注入(inject)到 SLSB 中,但这似乎有点神奇。如果 SLSB 被不同的进程(作业、UI 调用等)使用,它是否会为每个调用获得单独的实例?
为澄清和简化类结构而进行的编辑:
MapBean
需要是一个 ConversationScoped
对象,包含作业的特定实例/运行的数据。
@ConversationScoped
public class MapBean implements Serializable {
private Map<String, Object> data;
// accessors
public Object getData(String key) {
return data.get(key);
}
public void setData(String key, Object value) {
data.put(key, value);
}
}
作业将是ConversationScoped
:
@ConversationScoped
public class BatchJob {
@Inject private MapBean mapBean;
@Inject private Conversation conversation;
@Inject private JobProcessingBean jobProcessingBean;
public void runJob() {
try {
conversation.begin();
mapBean.setData("key", "value"); // is this MapBean instance now bound to the conversation?
jobProcessingBean.doWork();
} catch (Exception e) {
// catch something
} finally {
conversation.end();
}
}
}
作业可能会调用 SLSB,并且 MapBean
的当前对话范围实例需要可用:
@Stateless
public class JobProcessingBean {
@Inject private MapBean mapBean;
public void doWork() {
// when this is called, is "mapBean" the current conversation instance?
Object value = mapBean.getData("key");
}
}
我们的工作和 SLSB 框架非常复杂,SLSB 可以调用许多其他服务或本地实例化的业务逻辑类,并且每一个都需要访问对话范围的 MapBean
。
最佳答案
First, the job needs to also
@Inject
theMapBean
so that it can be loaded with job-specific data before theConversation.begin()
method is called. Would the container know to pass this instance to services down the call chain?
是的,因为 MapBean
是@ConversationScoped
它在从 conversation.begin()
开始的持续时间内与调用链相关联直到 conversation.end()
.你可以想到@ConversationScoped
(以及 @RequestScoped
和 @SessionScoped
)作为 ThreadLocal
中的实例- 虽然每个线程都存在它们的一个实例,但每个实例都绑定(bind)到该单个线程。
Related to that, according to this question Is it possible to @Inject a @RequestScoped bean into a @Stateless EJB? it should be possible to inject a
@ConservationScoped
bean into a SLSB, but it seems a bit magical. If the SLSB is used by a different process (job, UI call, etc), does it get separate instance for each call?
如果你看到这个模式和我上面解释的一样,那就没有你想象的那么神奇了。 SLSB 确实获得了一个单独的实例,但不仅仅是任何实例,该实例属于调用 SLSB 的范围。
除了您发布的链接外,另请参阅 this answer .
我测试了与您发布的代码类似的代码,它按预期工作 - MapBean
在整个通话过程中注入(inject)的是同一个。请注意两件事:
BatchJob
也是@ConversationScoped
但不执行 Serializable
,这将不允许 bean 钝化。data
未初始化,因此您将在 runJob()
中获得 NPE .关于java - 启动 CDI 对话并将 @ConversationScoped bean 注入(inject)无状态 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518334/
我正在编写一个 JSF 2.0 应用程序,我想使用 CDI 注释而不是“等效的”JSF 注释。换句话说,@Model 或@Named 代替@ManagedBean,@Inject 代替@Managed
我有一个 JSF facelets 页面,该页面根据他们正在查看的页面显示数据表。当我显示第 1 页时,我调用 view() action 方法从数据库中获取两个页面的数据并将其存储为 bean 的私
Java 1.7/JSF 2/JPA 2/Hibernate 4 我读过很多关于@ConversationScoped的教程和帖子,它们传达的信息都是一样的:当你有很多观点需要一个支持时,请使用它 b
我的项目正在使用 JSF2.0 和 CDI。对于一页,我希望我的支持 bean 与页面的生命周期相匹配。 @ViewScoped 似乎非常合适,但它不是 CDI 的一部分,然后使我们的解决方案不一致。
我现在开始使用 CDI 中的对话范围,我正在考虑如何在同一对话中配置页面。 我想配置一个XML来表示:page1和page2应该在同一个conversationScoped中,page3应该在新的co
我有一个@ConversationScoped bean,有一个启动方法,像这样: @PostConstruct public void start() { if (conversation.
我使用的是 JSF2 和 PrimeFaces,每次我发出 Ajax 请求并检查当前的对话 是否是短暂的,如果不是,则开始新的对话。 当我禁用 Ajax 请求时,表单会自动传递 cid 并恢复对话,但
关于临时保存 JSF 应用程序的状态,而不使用 session : 另一种方法是使用 Apache Tomahawk 库的 t:saveState;另一种更新的替代方法是使用 CDI @Convers
我有一个非常典型的 CRUD 情况,我正在苦苦挣扎,所以我想我一定是误解了一些东西。我整理了一个小演示应用程序来更好地解释我的问题。感兴趣的两个文件如下所示: PersonView - 支持 JSF
我们将 EntityManager 注入(inject) Bean(位于服务层内),如下所示: @Inject EntityManager entityManager 我们在 ManagedBean(
我们正在使用 EclipseLink 和 JBoss Weld 运行 JavaEE 6 环境。对于 EntityManager,我们目前正在使用 @ConversationScoped 范围,它非常适
我有一个带有名为 view() 的操作方法和 MyObject 类型的字段的 bean: @ManagedBean @ConversationScoped public class MyBean im
我用 JSF-Compnents 构建了一个短页面,它显示并递增来自 @ConversationScoped Bean 的值。此页面能够结束对话,并在结束旧对话后获得新的 Bean。这是它的样子:
我需要将 ConversationScoped bean 注入(inject)到 servlet 中。我使用标准的简单 @Inject 标记,并使用 cid 参数调用 servlet,但是当它调用注入
我正在使用 Spring Web Flow 2.0 开发一个项目。 我正在尝试对以决策状态开始的流程进行单元测试。决策状态检查 conversationScope 上的对象的值。我不知道如何将值插入单
javax.faces.flow.FlowScoped 和 javax.enterprise.context.ConversationScoped bean 之间有什么区别,什么时候应该在应用程序中使
我感兴趣的是,当我使用 CDI 时,通过 AJAX 使用 JSF 页面的正确方法是什么。我测试了使用 @SessionScoped 配置 CDI bean,但我发现 AJAX 有问题。 将 AJAX
我感兴趣的是,当我使用 CDI 时,通过 AJAX 使用 JSF 页面的正确方法是什么。我测试了使用 @SessionScoped 配置 CDI bean,但我发现 AJAX 有问题。 将 AJAX
目前我正在尝试删除 ConversationScoped 有状态 session Bean (SFSB)。 ConversationScope 由 CDI Container 管理,SFSB 的生命周
有人问过类似的问题,但没有完全解决我想做的事情。我们有一个基于 Seam 2.x 的旧应用程序,它带有我们正在转换为 CDI 的批处理作业框架。作业框架使用 Seam 上下文对象来发起对话。作业框架还
我是一名优秀的程序员,十分优秀!