2016-09-16 3 views
0

Я пытаюсь использовать @Conditional условие с @StepScope Spring Batch, чтобы использовать параметр JobParameter в Condition, но во время инициализации условия JobScope не активен. Я попытался определить, установлен ли флаг и только экземпляр компонента когда этот флаг установлен, в противном случае необходимо создать экземпляр другого компонента того же интерфейса.Можно ли использовать @StepScope вместе с @Conditional и 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 но @value значения равны нулю, так как они получают intitialized в начале программы.

Это также будет возможность показать мне другой способ, как я могу достичь загрузки компонента только в том случае, если задан параметр занятости.

ответ

1

То, что вы предлагаете, не будет работать, поскольку Conditional должен быть доступен раньше, чем выполнение задания. Я бы рекомендовал написать FactoryBean для обработки этого прецедента.