天天看點

Spring屬性編輯PropertyEditorSuppor轉換器Converter

這兩者的功能都是為了對我們前台請求資料的轉換,使程式能夠正常接收

PropertyEditorSupport : Spring 3.0之前使用的架構

Spring屬性編輯PropertyEditorSuppor轉換器Converter

Converter:Spring 3.0之後的類型轉換系統

Spring屬性編輯PropertyEditorSuppor轉換器Converter

兩者的差別詳細可看這篇文章:http://jinnianshilongnian.iteye.com/blog/1723270

一:屬性編輯PropertyEditorSuppor

首先編寫自己的類型 DatePropertyEditor 日期類型

public class DatePropertyEditor extends PropertyEditorSupport {
	
	@Override
	public Object getValue() {
		return super.getValue();
	}

	@Override
	public String getAsText() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(getValue());
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		Date date = null;
		try {
			//這裡的text一定是 2015-9-03 這樣類型和下面的格式一樣
			//這就是為什麼spring不提供轉換器的原意不知道你是什麼格式的調用setAsText對屬性值進行轉換類型
			date = new SimpleDateFormat("yyyy-MM-dd").parse(text);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		setValue(date);//類型轉換
		
	}
}
           

SEXPropertyEditor自定義枚舉類型

public class SEXPropertyEditor extends PropertyEditorSupport {
	
	@Override
	public Object getValue() {
		return super.getValue();
	}
	
	@Override
	public String getAsText() {
		return super.getAsText();
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		if(!StringUtils.isEmpty(text)){
			setValue(SEX.get(text)); 
		}else{
			setValue(null);
		}
	}
	
}
           

SEX枚舉類

public enum SEX {

    Male("1", "男"),
    
    Female("-1", "女"),
    
    Unknown("0", "保密");
    
    private final String value;
    
    private final String description;

    SEX(String v, String desc) {
        this.value = v;
        this.description = desc;
    }

    public String getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    public static SEX get(String strValue) {
        for (SEX e : values()) {
            if (e.getValue().equals(strValue)) {
                return e;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return this.value;
    }

}
           

控制器接收資料如下

@Controller
public class DataController {
	
		@RequestMapping("/binder")
		public void data(Date date,SEX sex/*參數裡面也可以放對象*/){
			System.out.println(date);
			System.out.println(sex.getDescription());
			System.out.println("=======");
		}
		/**
		 * 這個在資料傳到控制器方法前會執行,這裡對對象屬性進行編輯
		 * 如果沒有這步操作,請求将報 400錯誤
		 * @param binder
		 */
		@InitBinder
		public void initBinder(ServletRequestDataBinder binder){
			binder.registerCustomEditor(Date.class, new DatePropertyEditor());
			binder.registerCustomEditor(SEX.class, new SEXPropertyEditor());
		}
}
           

這個不是全局的,哪個控制器裡面需要轉換就必須用@InitBinder進行屬性編輯

二:轉換器Converter

通過implements Converter實作類型轉換

DateConverter日期格式的轉換器

/**
 * Converter<原類型,模闆類型> 
 */
public class DateConverter implements Converter<String,Date> {

	@Override
	public Date convert(String arg) {
		Date date = null;
		try {
			date = new SimpleDateFormat("yyyy-MM-dd").parse(arg); 
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
}
           

SexEnumConverter自定義枚舉類型的轉換器

public class SexEnumConverter implements Converter<String,SEX> {

	@Override
	public SEX convert(String str) {
		String value = str.trim();
        if (value.isEmpty()) {
            return null;
        }
        return SEX.get(str); //這裡就是将String類型轉換為自定義的枚舉
	}

}
           

然後我們需要修改一下配置檔案

<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="com.lwp.converter.DateConverter" />
				<bean class="com.lwp.converter.SexEnumConverter" />
			</set>
		</property>
	</bean>

	<mvc:annotation-driven conversion-service="conversionService"/>
           

此時這兩個轉換器就是全局可以不再使用屬性編輯器,控制器中的代碼删除InitBinder方法和注解

@Controller
public class DataController {
	
		@RequestMapping("/binder")
		public void data(Date date,SEX sex/*參數裡面也可以放對象*/){
			System.out.println(date);
			System.out.println(sex.getDescription());
			System.out.println("=======");
		}
		
}
           

通路http://localhost:8080/sw/binder?date=2013-9-12%2023:2:23&sex=-1背景結果表示轉換成功

Spring屬性編輯PropertyEditorSuppor轉換器Converter

注: 如果轉換器和屬性編輯器同時作用上,spring會先使用編輯器的方法,而不會再進入轉換器的操作.兩者不沖突.