2

Контейнера Glassfish 4,1CDI не будет работать с неявной областью @Dependent, неудовлетворенными точками впрыска компиляции ошибки времени

Я имею очень странный вопрос с КДИ прямо сейчас. Если я не комментирую свои службы NumberGenerator@Dependent, то при запуске приложения я получаю неудовлетворенную ошибку точки вставки. Но если я явно аннотирую свои NumberGenerator реализации, тогда все будет работать. Одним словом, если я хочу использовать инъекцию зависимости с @Dependent, которая является областью по умолчанию, я должен указать ее явно.

public interface NumberGenerator { 
    String generateNumber(); 
} 

Первая реализация NumberGenerator

import java.util.Random; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.enterprise.context.Dependent; 
import javax.inject.Inject; 

@ThirteenDigits 
@Dependent 
public class IsbnGenerator implements NumberGenerator { 

    @Inject 
    private Logger logger; 

    @Override 
    public String generateNumber() { 
     String isbn = "13-84356-" + Math.abs(new Random().nextInt()); 
     logger.log(Level.INFO, "Generated ISBN : {0}", isbn); 
     return isbn; 
    } 

} 

Вторая реализация NumberGenerator

import java.util.Random; 
import java.util.logging.Logger; 
import javax.enterprise.context.Dependent; 
import javax.inject.Inject; 

@EightDigits 
@Dependent 
public class IssnGenerator implements NumberGenerator { 

    @Inject 
    private Logger logger; 

    @Override 
    public String generateNumber() { 
     String issn = "8-" + Math.abs(new Random().nextInt()); 
     logger.info("Generated ISSN : " + issn); 
     return issn; 
    } 

} 

Это где NumberGenerator будет закачиваться

import javax.enterprise.context.Dependent; 
import javax.inject.Inject; 
import javax.interceptor.Interceptors; 


@Dependent 
public class BookService { 

    @Inject 
    @EightDigits 
    private NumberGenerator numberGenerator; 

    public Book createBook(String title, float price, String description) { 
     Book book = new Book(title, price, description); 
     book.setNumber(numberGenerator.generateNumber()); 
     return book; 
    } 

} 

Наконец, BookService вводится в этот управляемый компонент JSF для создания экземпляра Book.

import javax.enterprise.context.Dependent; 
import javax.inject.Inject; 
import javax.inject.Named; 


@Named 
@Dependent /* if I leave this out, then this bean will not display 
       the book instance properties on the JSF page, I just see 
       a blank screen, but when I add this @Dependent annotation 
       the JSF page displays the dummy content below. 
      */ 
public class MyBean { 

    @Inject 
    private BookService bookService; 

    public Book getBook() { 
    return bookService.createBook("Dummy Title", 21.05f, "Dummy Description"); 
    } 

} 

Как вы можете видеть, что я должен использовать @Dependent для области по умолчанию каждый раз, когда я хочу DI. Прямо сейчас я ввожу IssnGenerator квалификатором @EightDigits в класс BookService, и если я удалю @Dependent из IssnGenerator, я получаю эту ошибку компиляции.

Unsatisfied dependencies for type NumberGenerator with qualifiers @EightDigits at injection point [BackedAnnotatedField] @Inject @EightDigits private BookService.numberGenerator 

Благодарим за любые предложения.

+0

Никто не хочет помогать вообще? :( – Dummy

ответ

4

Если вы не укажете META-INF/beans.xml файл, который, кажется, ваш случай, вы получили архив в неявном бобе (see CDI-1.1 §12.1).

В неявной архив боба, только бобы с бобом, определяющей аннотацией будет обнаружено CDI двигатель.

Любая область измерения - это аннотация , определяющая аннотация (see CDI-1.1 §2.5). Вот почему, если вы добавляете область видимости, например @Dependent, ваш бит будет обнаружен CDI, и у вас нет неудовлетворенной ошибки зависимостей.

Тот факт, что @Dependent является областью по умолчанию, здесь не уместен, потому что без какой-либо области ваши компоненты просто не обнаружены.

Если добавить META-INF/beans.xml файл с bean-discovery-mode набором для all, то вы получили явный архив боба, это означает, что все бобы в вашем архиве будут обнаружены и будет иметь @Dependent объем по умолчанию.

+0

Ты мой спаситель, спасибо. – Dummy

Смежные вопросы