繁体   English   中英

应用程序错误地创建了多个CDI-Bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM