尽管它被“普遍劝阻”(谁?),我在我的 JSF-2.2 支持 bean 中使用了以下技术之一(取决于我是否需要personId
其他东西):
@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());
}
}