【发布时间】:2014-03-26 09:45:23
【问题描述】:
我有一个 JAX-RS Web 服务和 JSF/CDI bean 的混搭。我的 @Entitys 的通常显示来自 @ViewScoped JSF bean,它在 @PostConstruct 方法中收集相关实体:
@Named @ViewScoped
public class Manager {
private List<MyEntity> entities; // + getter
private MyEntity instance; // + getter/setter
@PostConstruct
public void init() {
entities = collectEntities();
instance = new MyEntity();
}
public void save() {
instance = persistInstance();
entities.add(instance);
}
// additional methods like collectEntities, persistInstance
}
普通操作可以调用manager.save来持久化一个新实体,并与旧实体一起显示。
现在,JAX-RS 服务还可以创建实体,这些实体应该在由此类作用域 bean 管理的集合中:
@Path("/myentity")
public class MyEntityService {
@PersistenceContext EntityManager em;
@PUT
public Response save(@FormParam("name") String name) {
MyEntity entity = new MyEntity(name);
em.persist(entity);
return Response.ok(entity.getId()).build();
}
}
可以在还有manager 实例的页面上调用该服务。
我的问题是:如何让现有的 manager 实例知道附加实体,以便 manager.entities 列表的 JSF ajax 重新呈现将包括由创建的实体网络服务?
到目前为止,我已经尝试过一个由 CDI bean 观察到的 CDI 事件。该事件从服务中触发,但 bean 从未接收到。
作为一种解决方法,我可以触发一个 JSF ajax 函数,告诉 manager 刷新它的实体列表(例如,利用 <a4j:jsFunction action="#{manager.init()}">)。但是我不确定其含义:当用户要求在初始化完成之前显示实体列表(默认情况下不显示列表)时,这是否会暴露时间问题?
作为一个彻底的黑客,我可能可以从服务中的会话中获取 bean 并输入我的数据。我只是想着它就颤抖。
【问题讨论】:
标签: jax-rs cdi jsf-2.2 view-scope