我有一個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並將我的數據打入。我只是在想這件事,我不寒而慄。
對於最後一部分:'FacesContext.getCurrentInstance()。getExternalContext()。getRequest()'返回'HttpServletRequest'。而且,由於我通過cookie爲用戶提供了'JSESSIONID',我甚至有他的會話。 – mabi