web-dev-qa-db-ja.com

JSFマネージドBean EJBインジェクション

エンタープライズアプリケーションモジュールにEJB(PersonManager)があり、別のEJB(Person)を挿入します。

@Stateful
public class PersonManager implements PersonManagerLocal {
    @EJB
    private PersonLocal person;

    @Override
    public void setPersonName(String name) {
        person.setName(name);
    }

    @Override
    public String getPersonName() {
        return person.getName();
    }
}

JSF WebアプリでPersonManager EJBを使用したい。 faces-config.xmlで定義します。

<managed-bean>
    <managed-bean-name>personManager</managed-bean-name>
    <managed-bean-class>ejb.PersonManager</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

問題は、PersonLocal EJBの注入が行われないことです。 personプロパティは常にNULLです。何が悪かったのですか?

しかし、PersonManagerをJSFマネージドBeanに次のように注入すると、

@ManagedBean
@RequestScoped
public class Index {
    @EJB
    private PersonManagerLocal personManager;
    ....

できます。最初のシナリオが必要です。助けてください:-D

19
Forty

EJBとJSFマネージドBeanの責任が混在しています。 faces-config.xmlは、EJBではなく、管理対象BeanなどのJSFアーティファクトのみを登録します。 faces-config.xmlでの登録

<managed-bean>
    <managed-bean-name>personManager</managed-bean-name>
    <managed-bean-class>ejb.PersonManager</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

基本的にはまったく同じです

@ManagedBean
@SessionScoped
public class PersonManager {
    // ...
}

つまり、#{personManager}がビューで使用できるJSF管理対象Beanとしてクラスを登録しています。これは、EJBコンテナによって管理されるのと同じインスタンスを表すものではありません。 notを使用して、EJBの登録にfaces-config.xmlを使用できます。そこでは、javax.ejb@Statelessなど、@Statefulパッケージの注釈を使用します。 EJBを登録するために必要なのはこれだけです。

実際、JSFマネージドBeanをfaces-config.xmlに登録するのは古いJSF 1.xの方法であり、JSF 2.xでは新しい@ManagedBeanアノテーションに置き換えられています。


pdate適切なアプローチは次のとおりです。

表示(Faceletsファイル):

<h:form>
    <h:inputText value="#{personManager.person.name}" />
    ...
    <h:commandButton value="Save" action="#{personManager.save}" />
    <h:messages />
</h:form>

コントローラー(JSF管理Bean):

@ManagedBean
@ViewScoped
public class PersonManager implements Serializable {

    private Person person;

    @EJB
    private PersonService personService;

    @PostConstruct
    public void init() {
        person = new Person();
    }

    public void save() {
        personService.create(person);
        FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage("Person successfully created, new ID is " + person.getId()));
    }

    // ...
}

モデル(JPAエンティティ):

@Entity
public class Person implements Serializable {

    @Id
    private Long id;

    private String name;

    // ...
}

サービス(ステートレスEJB):

@Stateless
public class PersonService {

    @PersistenceContext
    private EntityManager em;

    public void create(Person person) {
        em.persist(person);
    }

    // ...
}
40
BalusC