後臺date型別轉換為json字串時,返回前臺頁面的是long time值問題解決
https://blog.csdn.net/zhanglf02/article/details/77770118
問題頁面回顧:
本例環境和框架:maven工程+ssm框架+jdk1.7+tomcat7.0
解決方案:
解決方案分為兩種:
第一種:如果bo(實體類)對應的欄位(日期)型別為Date型別,用Jackson的註解@JsonFormat。
第二種:如果bo(實體類)對應的欄位(日期)型別為String型別,則在set方法上用字串擷取方式。下面具體來說。
1.用Jackson的註解@JsonFormat
1.1 引入jackson的jar包
一個非常重要的點就是jackson的依賴引入。我一開始就用的註解,就是jar包沒引入完整導致不成功!需要的jar包是:jackson-core.jar,jackson-databind.jar,jackson-annotations.jar
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId >com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId >jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
這時整個專案用到的所有jackson有關的jar包:
1.2 在查詢對映對應的實體類(bo)對應變數或者該變數的get方法上加上註解@JsonFormat
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
public class JiJinBo {
private Date jiJinTime;
//設定時區為上海時區,時間格式自己據需求定。
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
public Date getJiJinTime() {
return jiJinTime;
}
public void setJiJinTime(Date jiJinTime) {
this.jiJinTime = jiJinTime;
}
完成以上兩步就可以了。在頁面可以現實正常的時間格式:
2.在set方法上用字串擷取方式
2.1 關於jackson依賴
這裡就不用引入上面說的依賴。對應的pom.xml引入依賴僅留下這一個:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
對應的jar包如下:
2.2 在查詢對映對應的實體類(bo)對應變數或者該變數的set方法上擷取字串為yyyy-MM-dd型別。
import java.util.Date;
public class JiJinBo {
private String jiJinTime;
public String getJiJinTime() {
return jiJinTime;
}
public void setJiJinTime(String jiJinTime) {
this.jiJinTime = jiJinTime.substring(0,10);
}
完成這兩步也就可以實現同樣正常日期格式的頁面效果。
3.總結
本次問題解決的關鍵是理解為什麼要在get方法上加註解就能解決日期現實問題和在set方法上加上字串擷取就可以實現同樣的效果?
1.實體類bo的get,set方法除了我們主動呼叫來為其賦值取值或者改變值外,實際我們每次從資料庫查詢出結果,返回到前臺頁面都會隱形用到這些方法。
我們按條件查詢時,查詢條件我們主動呼叫set方法封裝到bo中,等查詢出結果後,框架會主動呼叫set方法,把查詢出來的key-value形式的值賦值給對應對映的實體bo的屬性上。當返回頁面現實每個bo資訊時,框架會主動呼叫bo的get方法去取值。
所以,我們會在get方法上加上jackson註解,讓日期格式經處理後在返回到頁面。我們在set方法上會先處理查詢出來的資料,然後賦值給bo.
2.關於資料庫欄位為日期型別時,我們對應的bo其實有兩個選擇。用Date型別或者String型別都是可以的。實際資料庫中我們自己寫sql時,為日期型別賦值不也是 jijintime) values(‘2017-03-29’)這種字串形式嘛。所以不一定用Date。兩外注意,一定不能在bo中用timestamp來作為屬性的型別。這個忘了為啥了,反正不支援。