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
...
}