我完全困惑了。我有一个标准的老式 EJB-CDI-JSF-Hibernate JavaEE 应用程序,在 JBoss AS 7.1 上运行。而且我的结构是绝对标准的结构。我有 JSF 站点,可以访问我的 CDI Bean。 CDI Bean 持有对我的实体之一的引用,EJB 用作 DAO。我的 bean 之一是这个 CommissionController。它工作得非常好。仅为一个用户创建一个实例。
package controller;
import java.io.Serializable;
import java.util.Date;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import lombok.Data;
import lombok.extern.java.Log;
import entities.Commission;
@SessionScoped
@Data
@Log
@Named
public class CommissionController implements Serializable {
private static final long serialVersionUID = -8452887234021054225L;
@Inject
private UserController userController;
@Inject
private CartController cartController;
private Commission commission;
@PostConstruct
public void init() {
commission = new Commission();
log.info("new CommissionController instance");
}
public void makeNewCommission() {
commission.setCart(cartController.getCart());
commission.setOrderDate(new Date());
commission.setOrderer(userController.getUser());
cartController.clearCart();
log.info(commission.toString());
}
}
现在我有一个不同的bean,但它认为它的结构完全相同:
package controller;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import lombok.Data;
import lombok.extern.java.Log;
import entities.Article;
import entities.Cart;
@SessionScoped
@Data
@Log
@Named
public class CartController implements Serializable {
private static final long serialVersionUID = 649140288918816488L;
@Inject
private UserController userController;
@Inject
private ArticleController articleController;
private Cart cart;
public void addToCart(Article article) {
cart.getArticleList().add(article);
cart.setSum(cart.getSum() + article.getPrice());
}
public void clearCart() {
cart.getArticleList().clear();
cart.setSum(0.0);
}
@PreDestroy
public void destroy() {
log.info("bean destroyed");
}
@PostConstruct
public void init() {
cart = new Cart();
log.info("new CartController instance");
}
public void removeFromCart(Article article) {
cart.getArticleList().remove(article);
cart.setSum(cart.getSum() - article.getPrice());
}
}
我无法向自己解释,但是第二个 bean 被一次又一次实例化,我无法在其中存储任何内容,因为它总是引用另一个 bean。
请帮助我解开这个谜团。如果您需要更多信息,我很乐意提供给您。也许,我有很大的不理解,但现在,我无法控制自己。
最佳答案
金比给了我这个问题的答案。事实上,JBoss AS 7.1.0社区版已经过时了。使用 WildFly 8.0.0 Final,一切都运行得很好。因此,如果您正在使用 CDI 的绝佳可能性,请尝试使用 WildFly 而不是 JBoss AS 7.1.0 Final Community。
关于java - 应用程序错误地创建了多个 CDI-Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674146/