我使用dropwizard 0.9.3
在MySQL上创建一个简单的REST API(使用Hibernate和Jackson -使用Java 8)。
我遇到了一个问题,当试图将UTC DateTime值保存到一个MySQL timestamp
列从应用层-而应用程序似乎处理得很好,在数据库中出现的值是一个BLOB
,所以我猜测沿着序列化值正确的方式某处。
我的实体看起来像这样:
@Entity
@Table(name = "users")
public class User {
@Id @NotNull @JsonProperty
private String id;
@JsonProperty @NotNull
@Column(name="name", nullable=false)
private String name;
@JsonProperty @NotNull
@Column(name="email", nullable=false)
private String email;
@JsonIgnore @JsonProperty @NotNull
@Column(name="createdAt", nullable = false)
private ZonedDateTime createdAt;
// default constructor
public User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
// get the current UTC timestamp
this.createdAt = ZonedDateTime.now(ZoneOffset.UTC);
}
}
对应的DAO为:
public class UserDAO extends AbstractDAO<User> {
public UserDAO(SessionFactory factory) {
super(factory);
}
public User create(User user) {
return persist(user);
}
}
资源是:
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class UsersResource {
private final UserDAO dao;
public UsersResource(UserDAO dao) {
this.dao = dao;
}
@PUT
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@UnitOfWork
public User create(
@FormParam("name") String firstName,
@FormParam("email") String email
) {
User user = new User(name, email);
return dao.create(user);
}
}
测试它与一个简单的curl
工作,但BLOB
被保存到DB的时间戳应该(例如显示一个值像2016-06-28 10:05:22
)。
我尝试遵循DW惯例,使用相当传统的引导(和dropwizard-java8
包)。我不确定我在这里错过了什么,但我也是DW和Java的新手。
建议不胜感激-谢谢。
DW正在使用hibernate 5+
要使Hibernate支持java时间类型,您需要包含以下依赖项:(用特定版本替换)
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>5.0.0.Final</version>
</dependency>
注意:这不会保存为时间戳类型。用MySQL测试,它保存为datetime类型。
(取自Java 8 LocalDateTime和Hibernate 4)
问候,
阿图尔