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

时间:2019-01-26 13:00:43

标签: java spring data-binding

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

@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]

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以添加自定义的Serializer和Deserializer来完成您想做的事情。定义如下的序列化器。

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;