简体   繁体   中英

Application creates multiple CDI-Beans by mistake

i'm absolutely baffled. I have a standard, old school EJB-CDI-JSF-Hibernate JavaEE Application, running on a JBoss AS 7.1. Furthermore my structure is an absolut standard structure. I have JSF-Sites, which access my CDI Beans. The CDI Beans are holding a reference to one of my entities, the EJBs are used as DAOs. One of my beans is this CommissionController. It works absolutely fine. Only one instance is created for one user.

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

Now i have a different bean, but it think it's the excact same structure:

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

}

I can't explain it to myself, but the second bean is instanciated again and again and I can't store anything in it, because it get always a reference to another bean.

Please, help me to bring light in this mystery. If you need additional information, I would love to give it to you. Maybe, I have a big lack of understanding but for now, I can't help myself.

Gimby gave me the answer to this question. In fact, JBoss AS 7.1.0 Community Edition is outdated. With WildFly 8.0.0 Final, everything worked perfectly fine. So, if you're working with the fantastic possibilities of CDI, try WildFly instead of JBoss AS 7.1.0 Final Community.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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