Beispielsweise möchten Sie möglicherweise eine Klasse definieren, die "FlatFileItemReaderBuilder", "ItemProcessor" und "JdbcBatchItemWriterBuilder" enthält, um eine Klasse zu erstellen, die ein Chunk-orientiertes Tasklet darstellt.
Selbst wenn diese Klasse als "Bean" registriert ist, funktioniert "JdbcBatchItemWriterBuilder" nicht normal mit dem folgenden Fehler.
Ausgabefehler
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL-Anweisung hat Syntaxfehler"INSERT INTO PEOPLE (FIRST_NAME, LAST_NAME) VALUES (:[*]FIRSTNAME, :LASTNAME)";Erwartete Aussage"), DEFAULT, NOT, EXISTS, INTERSECTS, UNIQUE"
Syntax error in SQL statement "INSERT INTO PEOPLE (FIRST_NAME, LAST_NAME) VALUES (:[*]FIRSTNAME, :LASTNAME)"; expected "), DEFAULT, NOT, EXISTS, INTERSECTS, UNIQUE"; SQL statement:
Aus irgendeinem Grund wurde : firstName
nicht in?
Konvertiert.
(Wenn Sie JdbcBatchItemWriterBuilder
direkt als Bean
registrieren, funktioniert das natürlich einwandfrei.)
Wenn alle Beans registriert sind, wird die Registrierung normalerweise abgeschlossen, indem "afterPropertiesSet ()" für die Klasse aufgerufen wird, die "InitializingBean" implementiert. Wenn Sie jedoch verschachtelte Objekte haben, die Beans sein sollten, werden diese nicht aufgerufen und die Registrierung wird nicht normal abgeschlossen.
Implementieren Sie "InitializingBean" in der übergeordneten Holding-Klasse (= direkt als "Bean" exponierte Klasse) und geben Sie sie an das Holding-Objekt weiter.
@Override
public void afterPropertiesSet() throws Exception {
Object[] objects = new Object[]{this.reader, this.processor, this.writer};
for (Object object : objects) {
if (object instanceof InitializingBean) {
((InitializingBean) object).afterPropertiesSet();
}
}
}
Recommended Posts