我有一个JAX-RS Web服务和JSF / CDI bean的混搭。我@Entity
的常见显示来自@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将包括由webservice创建的实体?
到目前为止,我已尝试 CDI bean观察到的CDI事件。该事件从服务中被触发但是bean从未接收过。
作为解决方法,我可以触发JSF ajax函数,告诉manager
刷新它的实体列表(例如,利用<a4j:jsFunction action="#{manager.init()}">
)。但是我不确定其含义:当用户要求在初始化完成之前显示实体列表时,是否会出现计时问题(默认情况下不显示列表)?
作为总hack ,我可以从服务中的会话中抓取bean并打开我的数据。我只是想着它而不寒而栗。
答案 0 :(得分:0)
视图范围是JSF特定的,作为JSF特定的CDI上下文。它仅在给定视图的范围内存活。 JAX-RS没有特定的方法可以让我想到访问这个范围。我认为视图范围甚至不能访问HTTP请求。