Spring MVC JSON自定義型別轉換
阿新 • • 發佈:2019-02-19
型別有很多,這裡只用日期為例說明。
在Spring MVC中存在兩大類的型別轉換,一類是Json,一個是Spring的Binder轉換。
JSON:
使用Json轉換時,可以如下使用:
- publicclass Test {
- private Date createdate;
- @JsonSerialize(using = DateYMDHMSJsonSerializer.class)
- public Date getCreatedate() {
- return createdate;
- }
-
@JsonDeserialize
- publicvoid setCreatedate(Date createdate) {
- this.createdate = createdate;
- }
- }
可以看到這裡使用了兩個Json轉換的註解:
第一個@JsonSerialize是轉換為字串,主要是後臺傳遞給前臺時的日期格式;
第二個@JsonDeserialize是轉換字串為日期型別,主要是從前臺往後臺傳遞時的日期。
兩個具體轉換類的實現:
- /**
-
* Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss"
- * Author: liuzh
- * Update: liuzh(2014-04-17 10:59)
- */
- publicclass DateYMDHMSJsonSerializer extends JsonSerializer<Date>{
- @Override
- publicvoid serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
-
try
- jsonGenerator.writeString(DateUtil.formatDate(date, DateUtil.DATE_FORMAT_TIME_T));
- } catch (BusinessException e) {
- jsonGenerator.writeString(String.valueOf(date.getTime()));
- }
- }
- }
- /**
- * Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss"
- * Author: liuzh
- * Update: liuzh(2014-04-17 10:59)
- */
- publicclass DateYMDHMSJsonDeserializer extends JsonDeserializer<Date> {
- @Override
- public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
- try {
- return DateUtil.formatStringToDate(jp.getText(), DateUtil.DATE_FORMAT_TIME_T);
- } catch (BusinessException e) {
- returnnew Date(jp.getLongValue());
- }
- }
- }
其中DateUtil是一個對日期格式轉換的工具類,使用的SimpleDateFormat進行轉換。
Binder:
這種型別轉換的時候,使用的是Spring的引數繫結,程式碼如下:
- /**
- * Description: 全域性型別轉換
- * Author: liuzh
- * Update: liuzh(2014-05-26 13:08)
- */
- publicclass GlobalDataBinder implements WebBindingInitializer {
- /**
- * 智慧日期轉換,針對四種格式日期:
- * 1.2014-05-26
- * 2.1401951570548
- * 3.2014-05-26 00:00
- * 4.2014-05-26 00:00:00
- */
- privateclass SmartDateEditor extends PropertyEditorSupport {
- /**
- * 根據2014-05-26 00:00:00長度來判斷選擇哪種轉換方式
- */
- @Override
- publicvoid setAsText(String text) throws IllegalArgumentException {
- if (text == null || text.length() == 0) {
- setValue(null);
- } else {
- try {
- if (text.length() == 10) {
- setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_YYYYMMDD));
- } elseif (text.length() == 13) {
- setValue(new Date(Long.parseLong(text)));
- } elseif (text.length() == 16) {
- setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_R));
- } elseif (text.length() == 19) {
- setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_T));
- } else {
- thrownew IllegalArgumentException("轉換日期失敗: 日期長度不符合要求!");
- }
- } catch (Exception ex) {
- thrownew IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);
- }
- }
- }
- /**
- * 轉換為日期字串
- */
- @Override
- public String getAsText() {
- Date value = (Date) getValue();
- String dateStr = null;
- if (value == null) {
- return"";
- } else {
- try {
- dateStr = DateUtil.formatDate(value, DateUtil.DATE_FORMAT_TIME_T);
- if (dateStr.endsWith(" 00:00:00")) {
- dateStr = dateStr.substring(0, 10);
- } elseif (dateStr.endsWith(":00")) {
- dateStr = dateStr.substring(0, 16);
- }
- return dateStr;
- } catch (Exception ex) {
- thrownew IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);
- }
- }
- }
- }
- @Override
- publicvoid initBinder(WebDataBinder binder, WebRequest request) {
- //日期格式轉換
- binder.registerCustomEditor(Date.class, new SmartDateEditor());
- }
- }
這裡對日期型別進行了一些判斷來特殊處理。該類需要在Spring的xml進行配置:
- <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
- <propertyname="webBindingInitializer">
- <beanclass="com.easternie.sys.common.GlobalDataBinder"/>
- </property>
- </bean>