如何在java枚举中注入依赖项?
我试图将bean注入枚举中,但在调用someMethod时,我不断得到null指针异常 这篇文章中提到的答案对我很有用。我想知道为什么我的代码不起作用如何在java枚举中注入依赖项?,java,spring,Java,Spring,我试图将bean注入枚举中,但在调用someMethod时,我不断得到null指针异常 这篇文章中提到的答案对我很有用。我想知道为什么我的代码不起作用 @Component public class DataProvider { public int method1() { //somecode } } public enum Genres { DRAMA(1,”Drama”); ADVENTURE(2,”Adventure”); HORROR(3,”Horror”); private
@Component
public class DataProvider {
public int method1() {
//somecode
}
}
public enum Genres {
DRAMA(1,”Drama”);
ADVENTURE(2,”Adventure”);
HORROR(3,”Horror”);
private int id;
private String name;
@Inject DataProvider dataprovider;
public int someMethod() {
return dataprovider.method1();
}
}
您链接的答案是循环
enum
值,并使用setter注入DataProvider
依赖项
public void postConstruct() {
for (ReportType rt : EnumSet.allOf(ReportType.class)) {
rt.setDataPrepareService(dataPrepareService);
}
}
它之所以能够工作,是因为ReportTypeServiceInjector
类是一个内部的静态类
,因此可以通过Spring查看和实例化它
无论如何,这是一个疯狂的设计。避免它。最后,保持枚举的简单性并提取
DataProvider
用法
您的原始代码无法工作,因为Spring无法在enum
s中插入依赖项
class GenresService{
// 1st option: Declare Genres enum reference at class level and
// initialize using class constructor/injection.
// Genres g;
@Inject DataProvider dataprovider;
//2nd option: pass Genres value to method at real time.
public int someMethod(Genres g) {
return dataprovider.method1();
}
}
要使任何注入工作,您需要同时管理
enum
。您可以尝试注入您的enum
,但如何注入以及注入什么?它提供常量值,此外,它还具有私有的无参数构造函数
因此,您可能需要在someMethod()
中进行一些JNDI查找,初始化dataProvider
,或者使用一些静态上下文访问器
而且:对于Spring,它不是
@Inject
,而是@Resource
或@Autowired
如果您想在枚举中注入一些东西,它不再是一个枚举,而是一个类。保持枚举简单。Spring也可以使用Inject。你也要和我一起去JNDI@LppEdd如果您添加javaeeapi
它将正常工作,则是正确的。