Dies ist ein Teil von mir job.xml
:
<job id="foo" job-repository="job-repository">
<step id="bar">
<tasklet transaction-manager="transaction-manager">
<chunk commit-interval="1"
reader="foo-reader" writer="foo-writer"
/>
</tasklet>
</step>
</job>
Dies ist der Item Reader:
import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("foo-reader")
public final class MyReader implements ItemReader<MyData> {
@Override
public MyData read() throws Exception {
//...
}
@Value("#{jobParameters['fileName']}")
public void setFileName(final String name) {
//...
}
}
Das sagt Spring Batch zur Laufzeit:
Field or property 'jobParameters' cannot be found on object of
type 'org.springframework.beans.factory.config.BeanExpressionContext'
Was ist hier los? Wo kann ich in Spring 3.0 mehr über diese Mechanismen lesen?
java
spring
spring-batch
yegor256
quelle
quelle
StepScope
ist jetzt standardmäßig verfügbar@Scope("step")
nicht für mich arbeiten, während@StepScope
tatWenn Sie Ihre
ItemReader
Instanz und IhreStep
Instanz in einer einzelnen JavaConfig-Klasse definieren möchten. Sie können die@StepScope
und die@Value
Anmerkungen verwenden, z.@Configuration public class ContributionCardBatchConfiguration { private static final String WILL_BE_INJECTED = null; @Bean @StepScope public FlatFileItemReader<ContributionCard> contributionCardReader(@Value("#{jobParameters['fileName']}")String contributionCardCsvFileName){ .... } @Bean Step ingestContributionCardStep(ItemReader<ContributionCard> reader){ return stepBuilderFactory.get("ingestContributionCardStep") .<ContributionCard, ContributionCard>chunk(1) .reader(contributionCardReader(WILL_BE_INJECTED)) .writer(contributionCardWriter()) .build(); } }
Der Trick besteht darin, dem itemReader einen Nullwert zu übergeben, da dieser durch die
@Value("#{jobParameters['fileName']}")
Annotation eingefügt wird .Vielen Dank an Tobias Flohre für seinen Artikel: Spring Batch 2.2 - JavaConfig Teil 2: JobParameters, ExecutionContext und StepScope
quelle
Ziemlich spät, aber Sie können dies auch tun, indem Sie eine @ BeforeStep-Methode mit Anmerkungen versehen:
@BeforeStep public void beforeStep(final StepExecution stepExecution) { JobParameters parameters = stepExecution.getJobExecution().getJobParameters(); //use your parameters }
quelle
JobScope
Um die jobParameters verwenden zu können, müssen Sie Ihren Reader als Scope-Schritt definieren. Ich bin mir jedoch nicht sicher, ob Sie dies mithilfe von Anmerkungen tun können.
Mit xml-config würde es so aussehen:
<bean id="foo-readers" scope="step" class="...MyReader"> <property name="fileName" value="#{jobExecutionContext['fileName']}" /> </bean>
Weitere Informationen finden Sie in der Spring Batch-Dokumentation .
Vielleicht funktioniert es,
@Scope
indem Sie den Schrittbereich in Ihrer XML-Konfiguration verwenden und definieren:<bean class="org.springframework.batch.core.scope.StepScope" />
quelle
Ergänzend zu einem zusätzlichen Beispiel können Sie auf alle Jobparameter in der JavaConfig-Klasse zugreifen:
@Bean @StepScope public ItemStreamReader<GenericMessage> reader(@Value("#{jobParameters}") Map<String,Object> jobParameters){ .... }
quelle
Während der Ausführung des Jobs müssen die Jobparameter wie folgt übergeben werden:
JobParameters jobParameters= new JobParametersBuilder().addString("file.name", "filename.txt").toJobParameters(); JobExecution execution = jobLauncher.run(job, jobParameters);
Mit der Ausdruckssprache können wir den Wert wie folgt importieren:
#{jobParameters['file.name']}
quelle
Haben Sie die Jobparameter als Map richtig als Bean deklariert?
Oder haben Sie möglicherweise versehentlich ein JobParameters- Objekt instanziiert , das keinen Getter für den Dateinamen hat?
Weitere Informationen zur Ausdruckssprache finden Sie in der Spring-Dokumentation hier .
quelle