【问题标题】:CDI injection always nullCDI 注入始终为空
【发布时间】:2019-02-14 19:44:50
【问题描述】:

您好,我正在尝试在我的代码中注入一个对象。但由于某种原因,它将保持为空。

我尝试了以下事情; 添加一个 PostConstruct(它不被称为......) 删除 CDI 的其他部分以使第一次注入工作。 还检查了是否在 Payara 中启用了 CDI。

我在 meta-inf 和 web-inf 中添加了 beans.xml

我调用 bean 的代码的缩短版本。

public class MovieFacade implements iMovieFacade {
    @Inject
    private iMovieDao md;
    @PostConstruct
    void init(){
        System.out.println(md);//I do this to test if the postConstruct is called
    }   
    public List<Movie> getAllMovie() {
        return md.getAllMovies();
    }
}

我尝试调用的类的短代码。

@ApplicationScoped
public class MovieDao implements iMovieDao {

private DataStoreMaker dataStoreMaker;
private DCM dcm;

    @PostConstruct
    private void onInit(){
        dataStoreMaker = new DataStoreMaker();
        dcm = new DCM(dataStoreMaker.movieDS());
    }
    public List<Movie> getAllMovies(){
        List<Movie> ml = dcm.find().asList();
        return ml;
    }
}

界面

public interface iMovieDao {
    void newMovie(Movie movie);
    Movie getId(String id);
    List<Movie> getAllMovies();
    void editMovie(Movie movie);
}

【问题讨论】:

  • 你在 MovieFacade 上放了 Stateless 吗? ApplicationScoped 适用于整个应用程序,因此将在开始时调用 PostConstruct。
  • 你怎么称呼MovieFacade?您如何获得对它的引用?
  • 您是否正确使用了javax.enterprise.context 包中的@ApplicationScoped 注释?听起来您可能正在使用 JSF 特定的。

标签: cdi javabeans payara java-ee-8


【解决方案1】:

在 Java EE 中,您的 MovieFacade 应该是由容器管理的 bean(具有生命周期)。 为此,只需添加您选择的注释,例如 @Stateless。

@Stateless
public class MovieFacade implements iMovieFacade {
    @Inject
    private iMovieDao md;
    @PostConstruct
    void init(){
        System.out.println(md);//I do this to test if the postConstruct is called
    }   
    public List<Movie> getAllMovie() {
        return md.getAllMovies();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多