无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型

Posted

技术标签:

【中文标题】无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型【英文标题】:Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime 【发布时间】:2019-06-20 01:47:33 【问题描述】:

我的问题有很多类似的问题,但我没有找到解决方案。 实体片段:

@DateTimeFormat
private LocalDateTime valid_from;

@DateTimeFormat
private LocalDateTime valid_to;

我的表格格式为 yyyy-MM-dd。我已经尝试过注释 @DateTimeFormat(format="yyyy-MM-dd") 和 ISO。我试过了:

 @InitBinder
public void initBinder(WebDataBinder webDataBinder) 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setLenient(true);
    webDataBinder.registerCustomEditor(LocalDateTime.class, new CustomDateEditor(dateFormat, true));

还有:

@Converter(autoApply = false)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, String> 

private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

@Override
public String convertToDatabaseColumn(LocalDateTime locDate) 
    return (locDate == null ? null : formatter.format(locDate));


@Override
public LocalDateTime convertToEntityAttribute(String dateValue) 
    return (dateValue == null ? null : LocalDateTime.parse(dateValue, formatter));

但我仍然有绑定错误:

无法将 java.lang.String 类型的属性值转换为属性 valid_from 所需的 java.time.LocalDateTime 类型;嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法从类型 [java.lang.String] 转换为类型 [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] 值 2019-01- 20;嵌套异常是 java.lang.IllegalArgumentException:值 [2019-01-20] 的解析尝试失败

【问题讨论】:

【参考方案1】:

为什么不在你的实体和数据库中使用 sql Date,你的列应该是没有时区的时间戳而不是字符串。如果你需要日期格式,为什么不使用 LocalDate 而不是 LocalDateTime?如果您使用 LocalDate,则很容易转换为 sql Date。 :)

【讨论】:

在这个表格中我只需要日期。但在其他情况下,我也需要时间。我在数据库中的列是时间戳而不是文本。我更喜欢 LocalDateTime 而不是 sql Date api。【参考方案2】:

您可以添加自定义序列化器和反序列化器来完成您想做的事情。像下面这样定义一个序列化器。

public class MyDateTimeDeserializer extends JsonDeserializer<LocalDateTime> 

    private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();

    @Override
    public DateTime deserialize(final JsonParser jsonParser,
                                final DeserializationContext deserializationContext) throws IOException 
        String dateStr = null;
        String timeStr = null;
        String fieldName = null;

        dateStr = jsonParser.getValueAsString();
        if (dateStr != null) 

            return LocalDateTime.parse(dateStr, formatter);
        
        return null;
     

您可以编写如下的反序列化器。

public class MyDateTimeSerializer extends JsonSerializer<LocalDateTime> 

    private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();

    @Override
    public void serialize(final DateTime dateTime,
                          final JsonGenerator jsonGenerator, 
                          final SerializerProvider serializerProvider) throws IOException 
        jsonGenerator.writeString(formatter.print(dateTime));
       

现在您可以如下注释您的日期时间字段。

@JsonSerialize(using = MyDateTimeSerializer.class)
@JsonDeserialize(using = MyDateTimeDeserializer.class)
private LocalDateTime valid_to;

【讨论】:

以上是关于无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

无法将 java.lang.String 类型的对象转换为 com.example 类型

无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]

无法将类型“java.lang.String”的属性值转换为属性“事务”所需的类型“java.util.List”

无法将类型“java.lang.String”的属性值转换为所需类型“java.util.Date”

无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型