春季批次:typeMismatch.java.sql.Date,typeMismatch

时间:2021-06-24 19:31:12

标签: spring spring-batch

我正在尝试使用 spring 批处理将此 csv 文件发送到数据库

users.csv

2021-06-22,test1@gmail.com, testFullname1, testMatricule1, 1234, testUsername1

2021-06-22,test2@gmail.com, testFullname2, testMatricule2, 0000, testUsername2

我有这个错误 无法将“java.lang.String”类型的属性值转换为属性所需的“java.sql.Date”类型

这里是批处理配置

package sofrecom.collaborateur.config;

import javax.sql.DataSource;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

import sofrecom.collaborateur.model.DAOUser;



@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public DataSource dataSource;

    @Bean
    public FlatFileItemReader<DAOUser> reader() {
        FlatFileItemReader<DAOUser> reader = new FlatFileItemReader<DAOUser>();
        reader.setResource(new ClassPathResource("users.csv"));
        reader.setLineMapper(new DefaultLineMapper<DAOUser>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "dateIntegration","email","fullname","matricule","password","username" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<DAOUser>() {{
                setTargetType(DAOUser.class);
            }});
        }});
        return reader;
    }

    @Bean
    public UserItemProcessor processor() {
        return new UserItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<DAOUser> writer() {
        JdbcBatchItemWriter<DAOUser> writer = new JdbcBatchItemWriter<DAOUser>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<DAOUser>());
        writer.setSql("INSERT INTO user ( date_integration,email,fullname,matricule,password,username) VALUES ( :dateIntegration,:email,:fullname,:matricule,:password,:username)");
        writer.setDataSource(dataSource);
        return writer;
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<DAOUser, DAOUser> chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }
}

这是用户物品处理器

package sofrecom.collaborateur.config;

import java.sql.Date;
import java.text.SimpleDateFormat;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;

import sofrecom.collaborateur.model.DAOUser;


public class UserItemProcessor implements ItemProcessor<DAOUser, DAOUser> {
    private static final Logger log = LoggerFactory.getLogger(UserItemProcessor.class);
    @Autowired
    private PasswordEncoder bcryptEncoder;

    @Override
    public DAOUser process(final DAOUser person) throws Exception {

        final String password = bcryptEncoder.encode(person.getUsername());
        
        final DAOUser transformedPerson = new DAOUser(person.getDateIntegration(),person.getEmail(),person.getFullname(),person.getMatricule(),password,person.getUsername());

        log.info("Converting (" + person + ") into (" + transformedPerson + ")");

        return transformedPerson;
    }

}

请提供任何解决方案!!

1 个答案:

答案 0 :(得分:0)

问题是 BeanWrapperFieldSetMapper 默认情况下不知道如何将像 2021-06-22 这样的字符串转换为 java.sql.Date 类型的对象(即字段 {{1} }) 在您的域对象 dateIntegration 中。告诉这个映射器如何处理自定义转换的方法是注册一个 DAOUser。此转换服务应在其中注册一个从 ConversionServiceString 的转换器。这是一个简单的例子:

java.sql.Date

您可以根据您在 this repository 中分享的内容找到完整的示例。