typemismatch.target spring boot批拒绝值[2020-09-18t00:00:00+02:00]

7bsow1i6  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(448)

我正在尝试使用批处理将csv文件中的数据与spring boot集成,日期字段有问题,因为无论使用何种类型,它都会被不断拒绝,下面是我的代码:

@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;
    }

返回的错误如下:
原因:org.springframework.validation.bindexception:org.springframework.validation.beanpropertybindingresult:1 errors字段“time”上的对象“target”中出现错误:拒绝值[2020-09-18t00:00:00+02:00];代码[typemismatch.target.time,typemismatch.time,typemismatch.java.sql.timestamp,typemismatch];参数[org.springframework.context.support.defaultmessagesourceresolvable:代码[target.time,time];参数[];默认消息[时间]];默认消息[未能将类型为'java.lang.string'的属性值转换为属性'time'所需的类型'java.sql.timestamp';嵌套异常为java.lang.illegalstateexception:无法将类型为“java.lang.string”的值转换为属性“time”所需的类型“java.sql.timestamp”:在org.springframework.batch.item.file.mapping.beanwrapperfieldsetmapper.mapfieldset(beanwrapperfieldsetmapper)中找不到匹配的编辑器或转换策略。java:201) ~[spring-batch-infrastructure-4.2.4.release。jar:4.2.4.release]在org.springframework.batch.item.file.mapping.defaultlinemapper.mapline(defaultlinemapper。java:43)~[spring-batch-infrastructure-4.2.4.release。jar:4.2.4.release]在org.springframework.batch.item.file.flatfileitemreader.doread(flatfileitemreader。java:185) ~[spring-batch-infrastructure-4.2.4.release。jar:4.2.4.release] ... 省略56个公共框架
谢谢你的帮助

ui7jx7zq

ui7jx7zq1#

正如错误所说,您正试图将一个字符串值赋给一个即时变量。那是什么意思 indProd.getTime() 试图成为一根弦。
解决这个问题的一种方法是将字符串重新输入到instant,这也许不是最好的解决方案,但应该可以。

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

而且在 IndProd 字符串的变量更改时间

v8wbuo2f

v8wbuo2f2#

从错误来看,很明显 indProd.getTime() 返回一个 String 试图分配给 Timestamp 变量。假设 indProd.getTime() 返回格式为的日期时间字符串, 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 以及api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。我建议您完全停止使用它们,转而使用现代的日期时间api。
使用现代日期时间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了解有关现代日期时间api的更多信息。如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

相关问题