我想将日期存储到我的数据库中。因此,我选择使用LocalDate类型。
LocalDate
如本文所述,我使用JPA转换器将转换LocalDate为Date。
Date
但是,当我要保留我的实体(使用POST和PUT请求)时,会遇到一些麻烦。
错误
2019-02-23 11:26:30.254 WARN 2720 --- [-auto-1-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string. at [Source: (PushbackInputStream); line: 1, column: 104] (through reference chain: ...entity.MyObject["startdate"])] org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.http.ResponseEntity]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.http.ResponseEntity` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 1, column: 2]
码
转换器
package ...entity; import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.time.LocalDate; import java.sql.Date; @Converter(autoApply = true) public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> { @Override public Date convertToDatabaseColumn(LocalDate locDate) { return (locDate == null ? null : Date.valueOf(locDate)); } @Override public LocalDate convertToEntityAttribute(Date sqlDate) { return (sqlDate == null ? null : sqlDate.toLocalDate()); } }
实体
package ...entity; import org.hibernate.annotations.ColumnDefault; import javax.persistence.*; import java.time.LocalDate; import java.util.HashSet; import java.util.Set; @Entity public class MyObject { @Id private String id; private LocalDate startdate; private LocalDate enddate; public MyObject() {} public MyObject(LocalDate enddate) { this.startdate = LocalDate.now(); this.enddate = enddate; } ... }
“主要”
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); MyObject myobject = new MyObject(LocalDate.parse("2019-03-01", formatter));
感谢帮助。
编辑1:MyObject的打印
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<>(this.toJsonString(myObject), headers); System.out.println(entity.toString()); // <{"id":"ba6649e4-6e65-4f54-8f1a-f8fc7143b05a","startdate":{"year":2019,"month":"FEBRUARY","dayOfMonth":23,"dayOfWeek":"SATURDAY","era":"CE","dayOfYear":54,"leapYear":false,"monthValue":2,"chronology":{"id":"ISO","calendarType":"iso8601"}},"enddate":{"year":2019,"month":"MARCH","dayOfMonth":1,"dayOfWeek":"FRIDAY","era":"CE","dayOfYear":60,"leapYear":false,"monthValue":3,"chronology":{"id":"ISO","calendarType":"iso8601"}}},[Content-Type:"application/json"]>
JPA 2.2支持LocalDate,因此不需要转换器。
Hibernate也从5.3版本开始支持它。
请查看本文以获取更多详细信息。