[英]Application creates multiple CDI-Beans by mistake
我绝对感到困惑。 我有一个标准的老式EJB-CDI-JSF-Hibernate JavaEE应用程序,在JBoss AS 7.1上运行。 此外,我的结构是绝对标准结构。 我有JSF-Site,可以访问我的CDI Bean。 CDI Bean持有对我的一个实体的引用,EJB被用作DAO。 我的其中之一就是这个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 Community Edition已过时。 使用WildFly 8.0.0 Final,一切都可以正常工作。 因此,如果您正在使用CDI的强大功能,请尝试使用WildFly而不是JBoss AS 7.1.0 Final Community。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.