Инъекция CDI всегда нулевая

Привет, я пытаюсь внедрить объект в свой код. Но по какой-то причине он останется нулевым.

Следующие вещи я пробовал; Добавление PostConstruct (который не вызывается...) Удаление других частей CDI, чтобы просто заставить работать первую инъекцию. Также проверил, включен ли CDI в Payara.

Я добавил beans.xml в meta-inf и web-inf.

Сокращенная версия кода, в которой я вызываю 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);
}

person Tjidde Nieuwenhuizen    schedule 14.02.2019    source источник
comment
Вы разместили Stateless на MovieFacade? ApplicationScoped предназначен для всего приложения, поэтому в начале будет вызываться PostConstruct.   -  person Sorin Penteleiciuc    schedule 14.02.2019
comment
Как вы звоните MovieFacade? Как вы получаете ссылку на него?   -  person Nikos Paraskevopoulos    schedule 15.02.2019
comment
Правильно ли вы используете аннотацию @ApplicationScoped из пакета javax.enterprise.context? Похоже, вы можете использовать специфичный для JSF.   -  person Adam Waldenberg    schedule 16.02.2019


Ответы (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();
    }
}
person S. Kadakov    schedule 26.02.2019