我想模块化我的JSF 2.1 / Java EE应用程序。我有一个由几个模块组成的页面。每个模块都应该使用单独的JSF辅助bean。其中一些模块需要在同一实体上显示和更改某些数据。
我已经尝试了一些方法,但到目前为止我并不满意。我问自己,最好的办法是什么?
所有模块都使用相同的实体,如果某些数据发生了变化,他们(可能)需要通知其他支持bean。
对我已经尝试过的一些方法的评论:
答案 0 :(得分:0)
尽管它“通常气馁”(由谁?),我在我的JSF-2.2支持bean中使用了以下技术之一(取决于我是否需要personId
):< / p>
@ViewScoped
public class BeanConverter {
@Inject @Param(name = "personId")
private ParamValue<Person> curPerson;
}
@ViewScoped
public class BeanConstruct {
@PersistenceContext
private EntityManager em;
@Inject @Param
private ParamValue<Long> personId;
private Person curPerson;
@PostConstruct
public void init() {
curPerson = em.find(Person.class, personId.getValue());
}
}
这使用了Omnifaces的出色CDI支持。
然后我使用merge()
来更新实体,但在我的情况下,只有一个bean可以保存对实体的更改,所以YMMV。当bean需要在它们之间传递更新或实体创建时,我通常会去javax.enterprise.Event
s,事件将实体作为构造函数参数获取:
public class BeanSending {
@Inject
private Event<PersonCreated> personCreatedEvent;
public void constructPerson() {
Person person = makePerson();
personCreatedEvent.fire(new PersonCreated(person));
}
}
public class BeanUpdater {
public void updatePerson(@Observes PersonCreated evt) {
doStuffWithPerson(evt.getPerson());
}
}
答案 1 :(得分:0)
我认为你需要的是CDI - Context & Dependency Injection。只需将您的页面切成许多较小的CDI bean,然后根据需要将它们互相注入。