我的问题有很多类似的问题,但是我没有找到解决方法。 实体片段:
@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]
答案 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;