CDI不会与隐式 @依赖性范围,不满足的注入点编译时间误差一起使用



容器是玻璃鱼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;
    }
}

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托管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进行默认范围。现在,我正在将IssnGenerator注入@EightDigits的CC_12中,如果我从IssnGenerator中删除@Dependent,我会收到此编译错误。

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

谢谢您的任何建议。

如果您不指定META-INF/beans.xml文件,这似乎是您的情况,您会得到隐式bean Archive (请参阅CDI-1.1§12.1)。/p>

隐式bean存档中,只有CDI引擎才能发现具有 bean定义注释的豆。

任何范围都是 bean定义注释(请参阅CDI-1.1§2.5)。这就是为什么如果您添加范围(例如@Dependent),则您的bean会被CDI发现,并且您没有不满意的依赖性错误。

@Dependent是默认范围的事实在这里与默认范围无关,因为如果没有任何范围,您的豆子就不会发现。

如果将bean-discovery-mode设置的META-INF/beans.xml文件添加到all,则您获得了显式bean Archive ,这意味着您的存档中的所有bean都将被发现,并且默认情况下将具有@Dependent范围。

最新更新