public interface ConverterFactory<S, R> {
//将S类型的对象转换为T类型,R为目标类型T的基类
<T extends R> Converter<S, T> getConverter(Class<T> targetType);
}
public interface GenericConverter {
//ConvertiblePair包含了源类型和目标类型,它的定义在下面
Set<ConvertiblePair> getConvertibleTypes();
//TypeDescriptor包含了需转换类型对象所在宿主类的信息,我们根据此信息,完成源到目标类型的转换
Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);
/**
* 内部类定义
*/
public static final class ConvertiblePair {
//源类型
private final Class<?> sourceType;
//目标类类型
private final Class<?> targetType;
/**
* 创建一个源-目标对子
*/
public ConvertiblePair(Class<?> sourceType, Class<?> targetType) {
Assert.notNull(sourceType, "Source type must not be null");
Assert.notNull(targetType, "Target type must not be null");
this.sourceType = sourceType;
this.targetType = targetType;
}
public Class<?> getSourceType() {
return this.sourceType;
}
public Class<?> getTargetType() {
return this.targetType;
}
//忽略hashCode\equals\toString等重写方法
}
}
public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {
}
public interface ConditionalConverter {
/**
* Should the conversion from {@code sourceType} to {@code targetType} currently under
*/
//根据源类型和目标类型所在宿主类型的上下文信息判断是否要进行类型转换
boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType);
}
public interface ConverterFactory<S, R> {
//获取将源类转换为特定R类或其子类的转换器
<T extends R> Converter<S, T> getConverter(Class<T> targetType);
}
package org.springframework.core.convert;
public interface ConversionService {
//判断sourceType是否可以转换为targetType
boolean canConvert(Class<?> sourceType, Class<?> targetType);
//TypeDescriptor描述了转换类的各类上下文信息,在类型转换实现方法中可以根据这些信息进行灵活控制
//比如这里通过源类和目标类的上下文信息判断是否可以进行转换
boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType);
//将source转换为targetType
<T> T convert(Object source, Class<T> targetType);
//利用源、目标类的上下文信息,将源类型转换为目标类型
Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);
}
public class MyConvertor implements Converter<String, User>{
@Override
public User convert(String source) {//source为要转换的字符串
String[] values = source.split(",");//根据我们的需求,用逗号来区分
Integer id = Integer.valueOf(values[0]);
User user = new User(id,values[1],values[2]);
return user;
}
}
/**********下面是我们的UserPOJO类**********/
public class User {
public User() {
super();
}
private Integer id;
private String userName;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public User(Integer id, String userName, String password) {
super();
this.id = id;
this.userName = userName;
this.password = password;
}
//忽略get和set方法
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password="
+ password + "]";
}
}
<!-- 通过:annotation-driven的conversion-service属性来装配我们的类型转换器 -->
<mvc:annotation-driven conversion-service="factoryBean" />
<!-- 通过ConversionServiceFactoryBean注册我们的自定义转换器 -->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="factoryBean" >
<property name="converters"><!-- 在属性converters注册 -->
<list>
<bean class="com.mvc.convertor.MyConvertor" />
</list>
</property>
</bean>
@RequestMapping("convert")
public String convert(User user){
System.out.println(user);
return "model1";
}
public class MySuperConvertor implements Converter<String, SuperUser>{
@Override
public SuperUser convert(String source) {
String[] values = source.split(",");
Integer id = Integer.valueOf(values[0]);
SuperUser superUser = new SuperUser(values[3], new User(id,values[1],values[2]));
return superUser;
}
}
/**********下面是SuperUser POJO类*********/
package com.mvc.model;
public class SuperUser extends User {
private String name;
//忽略get和set方法
public SuperUser(String name,User user) {
super(user.getId(),user.getUserName(),user.getPassword());
this.name = name;
}
public SuperUser() {
super();
}
@Override
public String toString() {
return "SuperUser [name=" + name + ", toString()=" + super.toString()
+ "]";
}
}
public class MyConvertorFactory implements ConverterFactory<String, User>{
@Override
//T类型必须是User或其子类,Stirng是我们的转换源类
public <T extends User> Converter<String, T> getConverter(
Class<T> targetType) {
if(targetType == User.class){
return (Converter<String, T>) new MyConvertor();
}else{
return (Converter<String, T>) new MySuperConvertor();
}
}
}
<!-- 通过:annotation-driven的conversion-service属性来装配我们的类型转换器 -->
<mvc:annotation-driven conversion-service="factoryBean" />
<!-- 通过ConversionServiceFactoryBean注册我们的自定义转换器 -->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="factoryBean" >
<property name="converters"><!-- 在属性converters注册 -->
<list>
<!--这里只要注册我们自定义的转换器工厂即可-->
<bean class="com.mvc.convertor.MyConvertorFactory" />
</list>
</property>
</bean>
//这是原来的
@RequestMapping("convert")
public String convert( User user){
System.out.println(user);
return "model1";
}
//下面是新添加的方法
@RequestMapping("convertSuper")
public String convert( SuperUser user){
System.out.println(user);
return "model1";
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有