2014-03-26 27 views
0

我有一個JAX-RS webservices和JSF/CDI bean的混雜體。我@Entity S的通常的顯示是從@ViewScoped JSF豆在@PostConstruct方法收集相關實體:從JAX-RS服務更新@ViewScoped bean

@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實例注意其他實體,從而使JSF的AJAX一個manager.entities列表的重新渲染將包括web服務創建的實體?

到目前爲止,我試過 CDI bean觀察到的CDI事件。該事件被從服務中解僱,但從未被bean收到。

作爲解決方法我能發射JSF AJAX功能告訴manager刷新它的(利用<a4j:jsFunction action="#{manager.init()}">,例如)實體列表。然而,我不確定這些含義:當用戶要求實體列表比初始化可以完成時顯示更早(該列表默認未顯示),這是否會暴露定時問題?

作爲一個完全破解我大概可以從服務中的會話中獲取bean並將我的數據打入。我只是在想這件事,我不寒而慄。

回答

0

查看範圍是JSF特定的東西,作爲JSF特定的CDI上下文。它只存在於給定視圖的範圍內。 JAX-RS沒有具體的方式可以考慮訪問這個範圍。我不相信視圖範圍甚至可以訪問HTTP請求。

+0

對於最後一部分:'FacesContext.getCurrentInstance()。getExternalContext()。getRequest()'返回'HttpServletRequest'。而且,由於我通過cookie爲用戶提供了'JSESSIONID',我甚至有他的會話。 – mabi