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



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

@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.ConversionFailed异常:无法将值 2019-01-20 从类型 [java.lang.String] 转换为类型 [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime];嵌套异常为 java.lang.IllegalArgumentException:值的解析尝试失败 [2019-01-20]

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

您可以添加自定义序列化程序和反序列化程序来完成您想要执行的操作。 定义如下所示的序列化程序。

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;

相关内容

最新更新