为什么需要类型转化?
用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