打算将数据库取出的Date类型的数据改为必定格式的时间,如改为yyyy-MM-dd。而后在属性的get方法上加了@JsonFormat,结果取出时一直是long类型的Date,代码以下:java
package soc.entity; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.fasterxml.jackson.annotation.JsonFormat; //@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) /*@XmlRootElement @XmlType(name = "user", propOrder = { "id", "name", "salary", "birthday"} )*/ public class User { private long id; private String name; @Min(value=6000,message="最低工资为6000") @Max(value=25000,message="最高工资为25000") private Double salary; private Date birthday; public User() { } public User(long id, String name, Double salary, String birthday) { super(); this.id = id; this.name = name; this.salary = salary; try { this.birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthday); } catch (ParseException e) { e.printStackTrace(); } } public User(String name, Double salary, String birthday) { super(); this.name = name; this.salary = salary; try { this.birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthday); } catch (ParseException e) { e.printStackTrace(); } } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } // @XmlJavaTypeAdapter(DateAdapter.class)//这种格式也能够<birthday>2018-10-15 10:12:15</birthday> // @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")//json的返回格式 @JsonFormat(pattern="yyyy/MM/dd HH:mm:ss",timezone = "GMT+8")//json的返回格式 public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public long getId() { return id; } public void setId(long id) { this.id = id; } @Override public String toString() { String birthdayS = (new SimpleDateFormat("yyyy-MM-dd")).format(birthday); return "User : id="+id+", Name="+name+", Salary="+salary+", Birthday="+birthdayS; } }
配置类以下:spring
package soc.config; import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.glassfish.jersey.filter.LoggingFilter; //import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spring.scope.RequestContextFilter; public class ApplicationApi extends ResourceConfig { public ApplicationApi() { // 注册数据转换器 register(JacksonJsonProvider.class); // 注册日志 register(LoggingFilter.class); // register application resources // register(UserResource.class); packages("soc.resource"); // register filters register(RequestContextFilter.class); // register mine exception class ,to find the trace of exception register(DebugMapperException.class); // register features // register(JacksonFeature.class); } }
通过一番查看,最后发现该配置类里的JacksonJsonProvider是数据库
org.codehaus.jackson.jaxrs.JacksonJsonProvider
而实体User类上的注解@JsonFormat则是json
com.fasterxml.jackson.annotation.JsonFormat
二者根本不是同一类型,将JacksonJsonProvider改为app
com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
则问题解决。
ide
综上得出结论,用@JsonFormat注解时,json格式支持的jaxrs的实现类必须与该注解是同一个大类型,即fasterxml,jar包以下:this
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.5.4</version> </dependency>
若是json格式支持的jaxrs的实现类是codehaus,则@JsonFormat注解不起做用,即不能够是以下jar包:spa
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.13</version> </dependency>