#spring-batch
Вопрос:
Я работал над приложением spring boot, в котором приложение работает нормально. Когда я попытался ввести следующий код
@Component
@Slf4j
@Getter
@Setter
public class EmployeeDbCreateWriter extends JdbcBatchItemWriter<Employee> {
@Autowired
DataSource datasource;
@Override
public void write(List<? extends Employee> employeeList) throws Exception {
.....
....
}
}
в итоге я получаю следующую ошибку
Caused by: java.lang.IllegalArgumentException: A DataSource or a NamedParameterJdbcTemplate is
required.
at org.springframework.util.Assert.notNull(Assert.java:201)
at
org.springframework.batch.item.database.JdbcBatchItemWriter.afterPropertiesSet
(JdbcBatchItemWriter.java:143)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
... 57 more
Настройка и проверка компонентов дана, работает нормально, прежде чем вводить вышеуказанный класс
@Configuration
@EnableWebMvc
@EnableJpaRepositories(basePackages =
{"com.emp.repositories","com.emp2.repositories"})
@EnableAsync(proxyTargetClass = true)
@ComponentScan(basePackages = {"com.emp","com.emp2"})
@EntityScan(basePackages = {"com.emp.models","com.emp2.models"})
@EnableCaching
@EnableBatchProcessing
@Slf4j
public class EmpConfig implements WebMvcConfigurer{
Где я ошибаюсь?
Комментарии:
1. Вам также нужно установить его на супер-класс. Но почему вы продлеваете
JdbcBatchItemWriter
? Это на самом деле не предназначено для расширения, а скорее для настройки.2. @M. Deinum Я хочу определить средство записи в отдельном классе вместо настройки, так как у меня есть класс классификатора — DatabaseOperationClassifier реализует классификатор, а средство записи является динамическим на основе выбранного ввода. Пожалуйста, посоветуйте
3. Тем не менее, я не вижу причин для его расширения, тем не менее проблема в том, что
JdbcBatchItemWriter
нужен источник данных, вы его отключаете. Что касается расширения, которое вы расширяетеJdbcBatchItemWriter
, но в основном игнорируете все, что предлагается этим классом, путем повторной реализацииwrite
метода.4. @M. Deinum Причина: Я хочу обработать CSV-файл и загрузить его содержимое или строки в БД или опубликовать как тему в AMQ или опубликовать как тему в Кафке на основе атрибута свойства, определенного в файле application.properties. Пожалуйста, посоветуйте, так как эти 3-это 3 разных писателя. Он должен работать в зависимости от конфигурации. Поэтому я использовал OperationClassifier, реализующий классификатор, в котором мы можем определить несколько записей и возвращать записи на основе значения свойства. Пожалуйста, посоветуйте, как это сделать.
5. Вам все равно не нужны подклассы, опять же, просто конфигурация этих авторов. Вам вообще не нужен классификатор, просто настройте соответствующий писатель на основе этого свойства (используя фабрику или условные компоненты). Ни один из которых (и не является классификатором) не нуждается в подклассе.
Ответ №1:
Согласно тому, что я вижу в JdbcBatchItemWriter, для этого требуется предоставить источник данных или JdbcTemplate, и он не знает об источнике данных с автоматической проводкой в дочернем классе.
Вы могли бы попробовать что-то подобное и предоставить источник данных вручную в PostConstruct
методе
@Component
@Slf4j
@Getter
@Setter
public class EmployeeDbCreateWriter extends JdbcBatchItemWriter<Employee> {
@Autowired
DataSource dataSource;
@PostConstruct
public void initialize() {
super.setDataSource(dataSource);
}
....
}
Однако, согласно @M.Комментарии Deinum сомнительно, что есть веские причины для расширения JdbcBatchItemWriter
и что этот класс должен был быть расширен.
Комментарии:
1. Я хочу обработать файл CSV и загрузить его содержимое или строки в БД или опубликовать как тему в AMQ или опубликовать как тему в Кафке на основе атрибута свойства, определенного в файле application.properties. Пожалуйста, посоветуйте, так как эти 3-это 3 разных писателя. Он должен работать в зависимости от конфигурации. Поэтому я использовал OperationClassifier, реализующий классификатор, в котором мы можем определить несколько записей и возвращать записи на основе значения свойства. Пожалуйста, посоветуйте, как это сделать.