在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ springmvc Converter轉(zhuǎn)換器問(wèn)題

springmvc Converter轉(zhuǎn)換器問(wèn)題

學(xué)習(xí)轉(zhuǎn)換器時(shí)候遇到的問(wèn)題:現(xiàn)在要轉(zhuǎn)換前臺(tái)傳過(guò)來(lái)的String格式的時(shí)間變成date格式的,轉(zhuǎn)換器里只指定了轉(zhuǎn)換之前的格式string和轉(zhuǎn)換之后的格式date 但是前臺(tái)傳過(guò)來(lái)的是一個(gè)對(duì)象,傳輸過(guò)來(lái)的不都是string類型的么,那么轉(zhuǎn)換器會(huì)將每個(gè)字段都轉(zhuǎn)換一遍么? 或者說(shuō)怎么知道要轉(zhuǎn)換的是date這個(gè)String而不是其他String
package com.demo.domain;

import java.util.Date;

public class User {

private Integer id;

private String username;

private Date birthday;

private String sex;

private String address;

..省略getter setter

}

String到j(luò)ava.util.Date的轉(zhuǎn)換器:

public class DateConveter implements Converter<String, Date>{

public Date convert(String source) {
    // TODO Auto-generated method stub
    try {
        if(null != source){
            DateFormat df = new SimpleDateFormat("yyyy:MM:dd HH-mm-ss");
            return df.parse(source);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
    return null;
}

}
controller:

public ModelAndView updateitem(User u){

}

回答
編輯回答
生性

原理說(shuō)明

Converter<String, Date> 接口必然有一個(gè)sourceType和targetType,這里就是StringDate,然后這兩個(gè)類型組成一個(gè)key,邏輯上可以認(rèn)為類似String_Date,而對(duì)應(yīng)的value就是你自定義的converter。因此只要是從String轉(zhuǎn)換為Date的變量,都會(huì)用這個(gè)converter進(jìn)行轉(zhuǎn)換。

源碼

GenericConversionService.getConverter方法中:

    protected GenericConverter getConverter(TypeDescriptor sourceType, TypeDescriptor targetType) {
        ConverterCacheKey key = new ConverterCacheKey(sourceType, targetType);
        GenericConverter converter = this.converterCache.get(key);
        if (converter != null) {
            return (converter != NO_MATCH ? converter : null);
        }

        converter = this.converters.find(sourceType, targetType);
        if (converter == null) {
            converter = getDefaultConverter(sourceType, targetType);
        }

        if (converter != null) {
            this.converterCache.put(key, converter);
            return converter;
        }

        this.converterCache.put(key, NO_MATCH);
        return null;
    }

問(wèn)題答題

傳輸過(guò)來(lái)的不都是string類型的么,那么轉(zhuǎn)換器會(huì)將每個(gè)字段都轉(zhuǎn)換一遍么

前半句沒(méi)錯(cuò),后半句稍加修改:轉(zhuǎn)換器會(huì)將所有Date類型的字段都轉(zhuǎn)換一遍

拓展

其實(shí)前端變量轉(zhuǎn)換并不一定是通過(guò)converter的方式,還有兩種方式推薦:

  • 使用@DateTimeFormat注解
public class Person {
    private String name;
    private Integer age;
    @DateTimeFormat(pattern = "yyyyMMdd")
    private Date birthDay;
    private Float salary;
    private Integer version;
}
  • 使用PropertyEditor
public class DemoController {

    @InitBinder
    public void intDate(WebDataBinder dataBinder) {
        dataBinder.addCustomFormatter(new DateFormatter("yyyyMMdd"));
    }
    
    ....

}

這種方式也可以指定轉(zhuǎn)換只應(yīng)用到某個(gè)指定field

2018年1月31日 17:05
編輯回答
野橘

input的name屬性不是和User的字段對(duì)應(yīng)嗎?
使用@DateTimeFormat注解格式化日期字段也可以。

2017年11月22日 13:42