Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java枚举中注入依赖项?_Java_Spring - Fatal编程技术网

如何在java枚举中注入依赖项?

如何在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

我试图将bean注入枚举中,但在调用someMethod时,我不断得到null指针异常

这篇文章中提到的答案对我很有用。我想知道为什么我的代码不起作用

@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中插入依赖项
  • 通常,在枚举中进行依赖项注入不是一个好的做法,因为它们被设计为常量/静态()
  • 但是,我同意你的看法,很多时候,我们需要将一些实时行为与枚举值一起封装

    我建议创建一个新类,并在其中封装Enum

    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
    它将正常工作,则是正确的。