エンタープライズアプリケーションモジュールに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
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);
}
// ...
}