Spring Batch @StepScope не может генерировать подкласс CGLIB

РЕДАКТИРОВАТЬ

Я создал тестовый проект, который повторяет проблему. Это можно найти наhttps://github.com/tomverelst/test-batch.

Сначала запустите команду Mavenexec:java запустить базу данных HSQL. Тогда вы можете запустить тест JUnitMigrationJobConfigurationTest загрузить контекст приложения Spring.

Оригинальный вопрос

При запуске приложения Spring Batch я получаю следующее исключение, когда Spring загружает мою работу:Конфигурация с:

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy34]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy34

Это вызвано@StepScope аннотация в моей работе "Конфигурация Он пытается прокси-класс с CGLIB, который уже прокси с JDK-прокси, и я неЯ не знаю, откуда этот прокси JDK.

Я также пытался использовать@Scope(value = "step", proxyMode = ScopedProxyMode.NO), но затем я получаю ошибку переполнения стека при вызове прокси-сервера JDK, который продолжает вызывать сам себя.

Приложение запускается правильно, если я удаляю@StepScope аннотации, но я должен иметь возможность использовать их для своей работы.

Весенний конфиг









// Job repository etc
...

MigrationJobConfiguration

@Configuration
public class MigrationJobConfiguration {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    private MigrationService migrationService;

    @Bean
    public Job migrationJob() {
        return jobs.get( "migrationJob" )
            .start( migrateCrfStep() )
            .next( indexRequestsStep() )
            .build();
    }

    @Bean
    public Step migrateCrfStep() {
        return steps.get( "migrateCrfStep" )
            .tasklet( migrateCrfTasklet() )
            .build();
    }

    @Bean
    public Step indexRequestsStep() {
        return steps.get( "indexRequestsStep" )
            . chunk( 5 )
            .reader( indexRequestReader() )
            .processor( indexRequestProcessor() )
            .writer( indexRequestWriter() )
            .build();
    }

    @Bean
    @StepScope
    public MigrateCrfTasklet migrateCrfTasklet() {
        return new MigrateCrfTasklet();
    }

    @Bean
    @StepScope
    public IndexRequestItemReader indexRequestReader() {
        return new IndexRequestItemReader();
    }

    @Bean
    @StepScope
    public IndexRequestItemProcessor indexRequestProcessor() {
        return new IndexRequestItemProcessor();
    }

    @Bean
    @StepScope
    public IndexRequestItemWriter indexRequestWriter() {
        return new IndexRequestItemWriter();
    }

    // Setters
    ...
}

Ответы на вопрос(2)

Ваш ответ на вопрос