尝试在具有@Any注释字段的类中注入bean。但是得到错误 -
引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型' javax.enterprise.inject.Instance'的限定bean。可用:预计至少有1个豆有资格作为autowire候选者。依赖注释:{@ javax.inject.Inject(),@ javax.enterprise.inject.Any()}
@Named
@Singleton
public class ProcessorFactoryImpl implements ProcessorFactory {
@Inject @Any
private Instance<Processor> processorList;
}
界面
public interface Processor {
some method
}
实施课程是:
@Named
@Singleton
@Default
public class ProcessorImpl implements Processor {
}
目前,我只有一个实现,所以没有创建限定符。
答案 0 :(得分:1)
您是否尝试过List
而不是Instance
?
@Autowired
private List<Processor> processorList;
答案 1 :(得分:1)
你正在混合Spring DI和CDI,它们不是一起工作的。
选择其中一个而不是两个。
@Named
@ApplicationScoped
public class ProcessorFactoryImpl implements ProcessorFactory
{
@Inject
private Processor processor;
}
和
@Dependent
@Default
public class ProcessorImpl implements Processor {
// etc ...
}
在这种情况下,processor
属性不是List!你应该考虑你的期望。如果您需要List<Processor>
,则必须使用CDI Producer
。
@Component
public class ProcessorFactoryImpl implements ProcessorFactory
{
@Inject // or @Autowired
private Processor processor;
}
和
@Scope("prototype")
public class ProcessorImpl implements Processor
{
// etc ...
}
如下面的评论所述,Spring可以使用@Inject
和@Named
,因为这些注释是JSR-330的一部分。
麻烦的是,在@Inject
字段上使用Instance<T>
进行过多的框架混合并不能像Spring那样实现,因为它是CDI功能。
要使用相同的功能,请使用Spring中的@Provider
。
示例:
@Inject
private Instance<MyClass> lazyInstance;
用法:
MyClasse instance = lazyInstance.get();
@Inject // or @Autowired
private Provider<MyClass> lazyInstance;
用法(与CDI相同):
MyClasse instance = lazyInstance.get();