typeMismatch.target spring 引导批拒绝值 [2020-09-18T00:00:00+02:00]

typeMismatch.target spring boot batch rejected value [2020-09-18T00:00:00+02:00]

我正在尝试使用批处理将来自 CSV 文件的数据与 spring 引导集成, 我对日期字段有疑问,因为无论使用何种类型,它都会不断被拒绝, 这是我的代码:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String service;
    private Timestamp time;

    @Override
    public IndProd process(final IndProd indProd) throws Exception {
        String service = indProd.getService();
        Timestamp time = indProd.getTime();
        Long nbAppels = indProd.getNbAppels();
        Integer tempsDeReponseMoyenMillisecondes = indProd.getTempsDeReponseMoyenMillisecondes();
        Long volume = indProd.getVolume();
        BigDecimal tempsDeReponseMoyenSecondes = indProd.getTempsDeReponseMoyenSecondes();
        IndProd transformedIndProd = new IndProd(service,time,nbAppels,tempsDeReponseMoyenMillisecondes,volume,tempsDeReponseMoyenSecondes);

        return transformedIndProd;
    }

这里是返回的错误:

Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'target' on field 'time': rejected value [2020-09-18T00:00:00+02:00]; codes [typeMismatch.target.time,typeMismatch.time,typeMismatch.java.sql.Timestamp,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.time,time]; arguments []; default message [time]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.sql.Timestamp' for property 'time'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.sql.Timestamp' for property 'time': no matching editors or conversion strategy found] at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.mapFieldSet(BeanWrapperFieldSetMapper.java:201) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:43) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:185) ~[spring-batch-infrastructure-4.2.4.RELEASE.jar:4.2.4.RELEASE] ... 56 common frames omitted

感谢您的帮助

如错误所述,您正在尝试将字符串值分配给 Instant 变量。 这意味着 indProd.getTime() 正在尝试成为字符串。

解决此问题的一种方法是将 String 重新键入回 instant,这可能不是最佳解决方案,但应该可行。

Timestamp time = Timestamp.from(ZonedDateTime.parse(indProd.getTime()).toInstant());

并在 IndProd 变量中将时间更改为 String

从错误中可以清楚地看出,indProd.getTime() returns 您正试图分配给 Timestamp 变量的 String 值。假设 indProd.getTime() returns 格式中的 date-time 字符串,例如 yyyy-MM-dd'T'HH:mm:ssXXX 2020-09-18T00:00:00+02:00(如问题标题中所述),您应该替换

Timestamp time = indProd.getTime();

Timestamp time = new Timestamp(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX").parse(indProd.getTime()).getTime());

注意: java.sql.Timestamp 扩展 java.util.Datejava.util 的 date-time API 及其格式 API、SimpleDateFormat 已过时且 error-prone。我建议你应该完全停止使用它们并切换到 modern date-time API.

使用现代date-time API:

OffsetDateTime odt = OffsetDateTime.parse(indProd.getTime());
//...
IndProd transformedIndProd = new IndProd(service,odt,nbAppels,tempsDeReponseMoyenMillisecondes,volume,tempsDeReponseMoyenSecondes);

并将实例成员声明为

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String service;
private OffsetDateTime odt;// Change the type to OffsetDateTime

Trail: Date Time. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project 上了解有关现代 date-time API 的更多信息。