【问题标题】:Update @ViewScoped bean from JAX-RS service从 JAX-RS 服务更新 @ViewScoped bean
【发布时间】: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 刷新它的实体列表(例如,利用 &lt;a4j:jsFunction action="#{manager.init()}"&gt;)。但是我不确定其含义:当用户要求在初始化完成之前显示实体列表(默认情况下不显示列表)时,这是否会暴露时间问题?

作为一个彻底的黑客,我可能可以从服务中的会话中获取 bean 并输入我的数据。我只是想着它就颤抖。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 对于最后一部分:FacesContext.getCurrentInstance().getExternalContext().getRequest() 返回HttpServletRequest。由于我通过 cookie 为用户获取了 JSESSIONID,因此我什至有他的会话。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多