2016-09-16 7 views
0

条件の中でjobParameterを使用するために@ Boseの@StepScopeで@条件を使用しようとしていますが、条件の初期化中にJobScopeがアクティブではありません フラグが設定されているかどうかを確認し、このフラグが設定されている場合は、同じインタフェースの別のBeanをインスタンス化する必要があります。@StepScopeと@ ConditionとjobParametersを併用することはできますか?

私は

interface IInter { 
    void bla(); 
} 

@Component("A") 
@Conditional(ACond.class) 
@StepScope 
class A implements IInter { 

    @Override 
    public void bla() { 
     //... do something .... 
    } 
} 

@Component("B") 
@Conditional(BCond.class) 
@StepScope 
class B implements IInter { 

    @Override 
    public void bla() { 
     //... do something else ... 
    } 
} 

class ACond implements Condition { 

    @Value("#{jobParameters[AProp]}") 
    String jobPropA; 

    @Value("#{jobParameters[BProp]}") 
    String jobPropB; 

    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     return !Utils.isEmpty(jobPropA) && Utils.isEmpty(jobPropB); 
    } 
} 

class BCond implements Condition { 

    @Value("#{jobParameters[AProp]}") 
    String jobPropA; 

    @Value("#{jobParameters[BProp]}") 
    String jobPropB; 

    @Override 
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
     return Utils.isEmpty(jobPropA) && !Utils.isEmpty(jobPropB); 
    } 
} 

ような何かをしようとしている瞬間に私は@StepScopeとない条件を試してみましたが、それらはプログラムの先頭にintitializedますので、@value値はnullです。

ジョブパラメータが設定されている場合にのみBeanをロードする方法とは別の方法を示すこともできます。

答えて

1

Conditionalはジョブの実行より早く利用可能にする必要があるため、提案している内容はうまくいかないでしょう。このユースケースを処理するにはFactoryBeanと書くことをおすすめします。

関連する問題