gpt4 book ai didi

JSF 托管 bean EJB 注入(inject)

转载 作者:行者123 更新时间:2023-12-03 13:20:27 25 4
gpt4 key购买 nike

我在企业应用程序模块中有一个 EJB(PersonManager),它注入(inject)了另一个 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 的注入(inject)。 person 属性始终为 NULL。我做错了什么?

但是,如果我将 PersonManager 注入(inject)到这样的 JSF 托管 bean 中:
@ManagedBean
@RequestScoped
public class Index {
@EJB
private PersonManagerLocal personManager;
....

有用。我需要第一种情况,请帮助我:-D

最佳答案

您正在混合 EJB 和 JSF 托管 bean 的职责。 faces-config.xml仅注册 JSF 工件,例如托管 bean 而不是 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>

基本上完全一样
@ManagedBean
@SessionScoped
public class PersonManager {
// ...
}

换句话说,您正在将该类注册为 JSF 托管 bean, #{personManager} 可以在 View 中使用它。 .这并不代表由 EJB 容器管理的同一实例。你可以而且应该 不是 使用 faces-config.xml注册 EJB。在那里,您使用 javax.ejb 中的注释。包,例如 @Stateless@Stateful .这就是注册 EJB 所需的全部内容。

实际上,在 faces-config.xml 中注册 JSF 托管 bean是一种旧的 JSF 1.x 方式,在 JSF 2.x 中已被新的 @ManagedBean 取代注解。

更新 正确的方法是:

查看(Facelets 文件):
<h:form>
<h:inputText value="#{personManager.person.name}" />
...
<h:commandButton value="Save" action="#{personManager.save}" />
<h:messages />
</h:form>

Controller (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);
}

// ...
}

关于JSF 托管 bean EJB 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8626291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com