从JAX-RS服务更新@ViewScoped bean

时间:2014-03-26 09:45:24

标签: jax-rs cdi jsf-2.2 view-scope

我有一个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并打开我的数据。我只是想着它而不寒而栗。

1 个答案:

答案 0 :(得分:0)

视图范围是JSF特定的,作为JSF特定的CDI上下文。它仅在给定视图的范围内存活。 JAX-RS没有特定的方法可以让我想到访问这个范围。我认为视图范围甚至不能访问HTTP请求。