3

我想模块化我的 JSF 2.1 / Java EE 应用程序。我有一个由几个模块组成的页面。每个模块都应该使用一个单独的 JSF 支持 bean。其中一些模块需要显示和更改来自/在同一实体上的一些数据。

我已经尝试了一些方法,但到目前为止我并不满意。我问自己最好的方法是什么?

所有模块都使用相同的实体,如果某些数据已更改,它们(可能)需要通知其他支持 bean。

对我已经尝试过的一些方法的评论:

  • 通过接口将实体传递给我的组件(XHTML)也不会将它传递给支持 bean
  • 通常不鼓励通过从请求参数中读取 id 在 bean 的 postContruct 方法中加载实体,而建议使用“viewParam”方法
  • 恕我直言,使用“viewParam”不如在创建 bean 之后拥有实体(在我的 postConstruct 中)。我不确定何时调用 bean 的 setter。
4

2 回答 2

0

尽管它被“普遍劝阻”(谁?),我在我的 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.Events ,其中事件将实体作为构造函数参数:

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());
    }
}
于 2013-12-09T10:29:07.200 回答
0

我认为您需要的是 CDI- Context & Dependency Injection。只需将您的页面切成许多较小的 CDI bean,然后根据需要将它们相互注入。

于 2013-12-09T12:20:46.397 回答