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

时间:2019-03-23 18:06:51

标签: java spring

我试图将一个bean注入到一个枚举中,但是在调用someMethod时,我不断收到空指针异常。

Inject bean into enum中提到的答案对我有用。我想知道为什么我的代码不起作用

   with(['products' => function($q) use($category_id){
                    $q->where('category_id',18);
                }])

                ->find($feature_ids)

                ->groupBy('feature_type_id');

3 个答案:

答案 0 :(得分:1)

您链接的答案是循环// Ensure delegate is bound (just once) CapsuleComponent->OnComponentBeginOverlap.RemoveDynamic(this, &AInteractiveFoliageActor::CapsuleTouched); CapsuleComponent->OnComponentBeginOverlap.AddDynamic(this, &AInteractiveFoliageActor::CapsuleTouched); 值,并使用setter注入enum依赖项

DataProvider

之所以起作用,是因为public void postConstruct() { for (ReportType rt : EnumSet.allOf(ReportType.class)) { rt.setDataPrepareService(dataPrepareService); } } 类是内部ReportTypeServiceInjector,因此Spring可以看到并实例化它。

反正这是一个疯狂的设计。避免它。
最终,使枚举保持简单并提取static class用法。

您的原始代码不起作用,因为Spring无法在DataProvider s中@Autowire / @Inject依赖项。

答案 1 :(得分:1)

  • 通常,在枚举中进行依赖注入不是一个好习惯,因为它们被设计为常量/静态(Reference

但是,我同意很多次,我们需要将一些实时行为与Enum值一起封装。

我建议创建一个新类,并在其中封装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();
 }
}

答案 2 :(得分:0)

要进行任何注射,您需要同时管理enum。您可以尝试注入enum,但是如何以及如何注入?它显示常量值,此外还具有私有的无参数构造函数。

因此,可能的工作方式是在dataProvider内部进行JNDI查找-初始化someMethod()或使用某些静态上下文访问器。

而且:对于Spring,它不是@Inject而是@Resource@Autowired