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.Date
和 java.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 的更多信息。
我正在尝试使用批处理将来自 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.Date
和 java.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 的更多信息。