Требуется источник данных, хотя он был указан и работал ранее

#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, реализующий классификатор, в котором мы можем определить несколько записей и возвращать записи на основе значения свойства. Пожалуйста, посоветуйте, как это сделать.