Метод, помеченный @Bean, вызывается напрямую. Вместо этого используйте инъекцию зависимостей - PullRequest
1 голос
/ 20 июня 2020

Я следую руководству по Spring Batch, и когда я пишу следующий код, IntelliJ жалуется, что вызов tasklet (null) в функции задания вызывается напрямую:

Method annotated with @Bean is called directly. Use dependency injection instead.

Я могу получить ошибка go исчезнет, ​​если я удалю аннотацию @Bean из задания, но я хочу знать, что происходит. Как я могу ввести туда фасоль? Простое написание tasklet(Tasklet tasklet(null)) дает ту же ошибку.

@Bean
@StepScope
public Tasklet tasklet(@Value("#{jobParameters['name']}") String name) {
    return ((contribution, chunkContext) -> {
        System.out.println(String.format("This is %s", name));
        return RepeatStatus.FINISHED;
    });
}

@Bean
public Job job() {
    return jobBuilderFactory.get("job")
            .start(stepBuilderFactory.get("step1")
                    .tasklet(tasklet(null))               // tasklet(null) = problem
                    .build())
            .build();
}

asd

1 Ответ

2 голосов
/ 20 июня 2020
@Bean
@StepScope
public Tasklet tasklet(@Value("#{jobParameters['name']}") String name) {
    return ((contribution, chunkContext) -> {
        System.out.println(String.format("This is %s", name));
        return RepeatStatus.FINISHED;
    });
}

@Bean
public Job job(Tasklet tasklet) {
    return jobBuilderFactory.get("job")
            .start(stepBuilderFactory.get("step1")
                    .tasklet(tasklet)
                    .build())
            .build();
}

Создание Spring Bean и AOP очень разборчивы. Вы должны быть очень осторожны с использованием.

В этом случае вы можете использовать bean-зависимость для решения, что имя TaskLet имеет значение null.

...