javascript
在SpringMVC中使用Jackson并格式化时间
在spring?MVC 3中,要實現REST風格的JSON服務,最簡單的方式是使用?@ResponseBody?注解。該注解會自動把返回的對象,序列化為JSON。
來看一個最簡單的例子。這個例子先使用Spring 3.0.5 + Jackson1.7.1。Jackson是Spring使用的JSON序列化/反序列化第三方庫。
pom.xml 的主要內容如下
<!-- Spring Framework Dependencies --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- jackson json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.7.1</version> </dependency>再定義了一個 POJO 對象 TestParams,由Controller的doTestQuery方法中返回該對象。
public class TestParams { private Date formatTime; private Date originTime; private int i; public Date getFormatTime() { return formatTime; } public Date getOriginTime() { return originTime; } public int getI() { return i; } public void setFormatTime(Date formatTime) { this.formatTime = formatTime; } public void setOriginTime(Date originTime) { this.originTime = originTime; } public void setI(int i) { this.i = i; } } @ResponseBody @RequestMapping(value="/test", method=RequestMethod.GET) public Object doTestQuery() { TestParams params = new TestParams(); params = new TestParams(); Date now = new Date(); params.setFormatTime(now); params.setOriginTime(now); return params; }請求示例URL ,瀏覽器返回
{"formatTime": 1412509897631, "originTime": 1412509897631, "i": 0 }并且返回的報文內容類型也是妥妥的:?Content-Type:application/json;charset=UTF-8
只是時間看起來挺別扭。
默認情況下Jackson將?Java.util.Date?序列化為?epoch timestamp,并且時區使用的是?GMT標準時間,而非本地時區。
“因為這樣最有效且準確”。
Why do Dates get written as numbers?
Default serializer for java.util.Date (and related, such as java.util.Calendar) serialize them using the most efficient accurate representation, so-called epoch timestamp (number of milliseconds since January 1st, 1970, UTC). Assumption is that if user does not care, we should use efficient and accurate representation to get job bdone
如果你開發過跨大洲跨時區的web站點,就會知道上面的話是實踐出真知。
那么當我想要一個可讀性良好的時間格式,該怎么做呢?
在Jackson1.x時代,可以擴展?JsonSerializer,來實現一個格式化時間的JsonDateSerializer,并在注解中引用這個類
@JsonSerialize(using=JsonDateSerializer.class) public Date getDate() { return date; }具體可以參見《How to Serialize Java.util.Date with Jackson JSON Processor / Spring 3.0》。
這種方法讓人愛不起來,又弱又麻煩的感覺。
進一步查詢,發現有一個注解?@JsonFormat?可以方便的格式化時間字段。
但這個注解看了下只在 Jackson2 才有。于是我陷入了Spring 版本和Jackson2的迷思中,一番折騰。
如果不想使用?@JsonFormat?注解,jackson-mapper-asl仍然可以使用1.x的版本,來搭配 Spring 3.x系列。
如果想使用?@JsonFormat?注解,需要將Spring升級到?3.1.2?以上。
并且要將Jackson的jar包更換為2.x系列的(和1.x系列相比,包名都換了)。
升級后的pom.xml如下:
<!-- Spring Framework Dependencies --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework<groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.2.3</version> </dependency>這時候可以在 TestParams 愉快地加上注解
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date formatTime;再次訪問測試URL,返回JSON對象如下
{"formatTime": "2014-10-05 20:20:15", "originTime": 1412511615062, "i": 0 }本文轉自二郎三郎博客園博客,原文鏈接:http://www.cnblogs.com/haore147/p/7212594.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的在SpringMVC中使用Jackson并格式化时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Curator] Path Cache
- 下一篇: ScrollViewer滚动究竟来触发载