Spring的类型转换

为什么需要类型转化?

用Hibernate时,往往需要添加一对多或多对一映射。比如下面这个持久化类。

package cn.sjsedu.ipbind.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="computer")
public class Computer {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private String username;
	private String name;
	private String ip;
	private String ipv6;
	private String mac;
	private String hdserial;

	@ManyToOne
	@JoinColumn(name="school_id")
	private School school;
	
	//setter and getter method
}



再看这个表单页面

	<form:form commandName="computer" action="save" method="post">
		<form:errors path="*" element="div"></form:errors>
		使用者:<form:input path="username"/><br/>
		计算机名:<form:input path="name"/><br/>
		IP地址:<form:input path="ip" /><br/>
		MAC地址:<form:input path="mac" /><br/>
		硬盘序列号:<form:input path="hdserial" /><br/>
		学校:<form:input path="school" />
		<input type="submit" value="提交"/>
	</form:form>


Spring提供了一些简单的基本转化,比如String转Integer,但是怎么吧String转为School类型呢。这就需要自定义类型转化了。


如何定义自己的类型转换?

Spring提供了三种SPI。(问题:什么是SPI?与API有什么区别?)

分别是:

1. Converter
package org.springframework.core.convert.converter;

public interface Converter<S, T> {

    T convert(S source);

}


2. ConverterFactory
package org.springframework.core.convert.converter;

public interface ConverterFactory<S, R> {

    <T extends R> Converter<S, T> getConverter(Class<T> targetType);

}


3. GenericConverter
package org.springframework.core.convert.converter;

public interface GenericConverter {

    public Set<ConvertiblePair> getConvertibleTypes();

    Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);

}


只要实现这些接口就行了。

那么写好了自己的转化类,该如何使用?

只需要在WebApplicationContext中加入如下代码:
<!--下面这行一定要有-->
<mvc:annotation-driven conversion-service="conversionService"/>

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <!--替换自己的类名-->
            <bean class="example.MyCustomConverter"/>
        </list>
    </property>
</bean>



这样就Okey了。

参考文献 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/validation.html#core-convert

猜你喜欢

转载自notafreak.iteye.com/blog/1786505