Dependency injection CDI将无法处理隐式@Dependent作用域、未满足的注入点编译时错误

Dependency injection CDI将无法处理隐式@Dependent作用域、未满足的注入点编译时错误,dependency-injection,glassfish,cdi,managed-bean,glassfish-4.1,Dependency Injection,Glassfish,Cdi,Managed Bean,Glassfish 4.1,容器是玻璃鱼4.1 我现在对CDI有一个非常奇怪的问题。如果我没有为我的NumberGenerator服务@Dependent添加注释,那么我在运行应用程序时会不断遇到不满意的注入点错误。但是,如果我显式地注释我的NumberGenerator实现,那么一切都将正常工作。一句话,如果我想使用默认作用域@Dependent进行依赖注入,我必须显式地指定它 public interface NumberGenerator { String generateNumber(); } N

容器是玻璃鱼4.1

我现在对CDI有一个非常奇怪的问题。如果我没有为我的
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;
    }

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

}
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管理的bean中,以创建一个
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");
    }

}
如您所见,每次需要DI时,我都必须对默认范围使用
@Dependent
。现在,我正在将带有限定符
@EightDigits
IssnGenerator
注入到
BookService
类中,如果我从
IssnGenerator
中删除
@Dependent
,我将收到此编译错误

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

谢谢您的建议。

如果您没有指定一个
META-INF/beans.xml
文件(这似乎是您的情况),那么您将得到一个隐式bean存档()

在隐式bean归档中,CDI引擎只会发现具有bean定义注释的bean

任何作用域都是定义bean的注释()。这就是为什么如果您添加一个作用域,比如
@Dependent
,您的bean会被CDI发现,并且不会出现不满意的依赖性错误

@Dependent
是默认作用域这一事实在这里并不相关,因为没有任何作用域,您的bean根本就不会被发现


如果您添加一个
META-INF/beans.xml
文件,并将
bean发现模式设置为
all
,那么您将获得一个显式的bean存档,这意味着存档中的所有bean都将被发现,并且默认情况下将具有
@依赖的
作用域。

没有人愿意提供任何帮助:(