spring-Converter类型转换器

Converter

在Spring3中引入了一个Converter接口,它支持从一个Object转为另一个Object。除了Converter接口之外,实现ConverterFactory接口和GenericConverter接口也可以实现我们自己的类型转换逻辑。

Converter接口

Converter<S, T>接口定义了从类型S转换为类型T的转换器。

package org.springframework.core.convert.converter;
public interface Converter<S, T> {  //S:源数据类型,T:转换后数据类型
	T convert(S source);
}

示例:

假设我们有一个简单的User类和一个UserDTO类,我们想要将User对象转换为UserDTO对象,我们可以实现Converter接口。

public class User {  
    private String username;  
    private String email;  

    // Getters and Setters  
}  

public class UserDTO {  
    private String username;  

    // Getters and Setters  
}  
//User类转换成UserDTO类
public class UserToUserDTOConverter implements Converter<User, UserDTO> {  
    @Override  
    public UserDTO convert(User user) {  
        if (user == null) {  
            return null;  
        }  
        UserDTO userDTO = new UserDTO();  
        userDTO.setUsername(user.getUsername());  
        return userDTO;  
    }  
}

注册Converter

在Spring中,你可以将这个转换器注册到ConversionService中,从而在你的应用程序中使用。

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.core.convert.converter.Converter;  
import org.springframework.core.convert.support.DefaultConversionService;  

@Configuration  
public class ConverterConfig {  
    @Bean  
    public Converter<User, UserDTO> userToUserDTOConverter() {  
        return new UserToUserDTOConverter();  
    }  

    @Bean  
    public DefaultConversionService conversionService() {  
        DefaultConversionService conversionService = new DefaultConversionService();  
        conversionService.addConverter(userToUserDTOConverter());  
        return conversionService;  
    }  
}

ConverterFactory接口

ConverterFactory 可以根据需要生成多种转换器,避免在代码中直接创建具体的转换器实例。

package org.springframework.core.convert.converter;

public interface ConverterFactory<S, R> {  //S:源类,R:目标类的基本类

	<T extends R> Converter<S, T> getConverter(Class<T> targetType); //T == targetType 真正的目标类
}

示例

创建一个类实现ConverterFactory接口,重写convert方法

//将 S 参数化为要转换的起始类型,将 R 参数化为定义基本类型 您可以转换为的类的范围。然后实施 ,其中 T 是 R 的子类
@Component
 //S:源数据类,R:目标类的基本类
public class StringToBaseEnumConverterFactory implements ConverterFactory<S, R> {  
   
    @Override
    public <T extends R> Converter<S, T> getConverter(Class<T> targetType) { //T == targetType 真正的目标类形
        return new Converter<S, T>() {
            @Override
            public T convert(S source) {
                return null;
            }
        };
    }
}

注册ConverterFactory

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Autowired
    private StringToBaseEnumConverterFactory stringToBaseEnumConverterFactory;

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverterFactory(this.stringToBaseEnumConverterFactory);
    }
}
posted @ 2024-09-25 09:41  CH_song  阅读(8)  评论(0编辑  收藏  举报