如何在JSF支持bean之间共享实体?

时间:2013-12-09 09:38:30

标签: jsf jsf-2 managed-bean viewparams

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

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

所有模块都使用相同的实体,如果某些数据发生了变化,他们(可能)需要通知其他支持bean。

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

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

2 个答案:

答案 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,然后根据需要将它们互相注入。