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

标签 java jsf jakarta-ee cdi

我完全困惑了。我有一个标准的老式 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/

相关文章:

java - Sonar - 存储副本 - 不应直接存储或返回可变成员

jsf - 那里有免费的 JSF Webhost 吗?

java - EJB3 业务代表

jakarta-ee - JSF 页面未从 CDI bean 检索变量

java - 什么是 NullPointerException,我该如何解决?

java - 如何将选定的值从 <select> 传递到 java 代码

java - xhtml 上的 JSF/Primefaces 内联单元格编辑不起作用

java - catalina.out 中的这些警告是什么?

java - 为什么 ide 内部浏览器给出 Http 500 内部服务器错误

java - Spring @RedisHash findAll() 返回空值