Spring Batch @StepScope generieren kann, CGLIB Unterklasse
BEARBEITEN
Erstellte ich ein test-Projekt, das sich repliziert, das Problem. Es finden sich unter https://github.com/tomverelst/test-batch.
Ersten ausführen des maven-Befehl exec:java
zum starten einer HSQL-Datenbank. Dann führen Sie den JUnit-test MigrationJobConfigurationTest
zum laden des Spring application context.
Ursprüngliche Frage
Beim starten meines Spring-Batch-Anwendung, bekomme ich die folgende exception, wenn der Frühling laden ist mein job-Konfiguration:
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
Dies ist verursacht durch die @StepScope
Anmerkung in meinem job-Konfiguration. Es wird versucht, die proxy-Klasse mit CGLIB, die bereits weitergeleitete mit einer JDK-proxy und ich weiß nicht, wo das JDK proxy ist aus.
Habe ich auch versucht, mit Hilfe @Scope(value = "step", proxyMode = ScopedProxyMode.NO)
, aber dann bekomme ich einen stack-überlauf-Fehler beim Aufruf der JDK-proxy verhindert Aufruf selbst.
Die Anwendung startet korrekt, wenn ich entfernen Sie die @StepScope
Anmerkungen, aber ich muss in der Lage sein, um Sie für meine stellen.
Frühjahr config
<context:component-scan base-package="com.jnj.rn2.batch" />
<context:annotation-config />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean class="org.springframework.batch.core.scope.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" )
.<LegacyRequest,LegacyRequest> 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
...
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
kann ich nicht bieten Ihnen eine eigentliche Antwort (noch) nicht, aberich habe ausgetestet das Beispiel, das Sie zur Verfügung gestellt haben und dies ist geschehen:@Configuration
definition Leser sieht@StepScope
Anmerkung, die Anmerkungen mit@Scope(value = "step", proxyMode = ScopedProxyMode.TARGET_CLASS)
reader
während das original bean ist registriert alsscopedTarget.reader
.StepScope
kicks in-und post-Prozessestep
scoped beans. Es erkennt die CGLIB erweitertreader
definition und versucht zu erstellen-proxy für dass => FEHLER.Gibt es zwei proxying Mechanismen in Konflikt. Es ist etwas wirklich komisches passiert und es scheint mir, dass dies niemals funktionieren kann. Wird versuchen, die Suche durch eine Feder JIRA.
UPDATE
Lösung gefunden - Sie brauchen, um deaktivieren Sie auto-proxying für Schritt-Umfang:
@EnableBatchProcessing
und es funktioniert.Leicht entfernen
<bean class="org.springframework.batch.core.scope.StepScope" />
von Ihrer Konfiguration-Datei; Sie müssen nicht fügen Sie es explizit, weil definiert ist, in der batch-namespace (wie beschrieben in offizielle Dokumentation von Step Rahmen)