弹簧转换服务 - 从 List<A> 到 List<B>

2022-09-03 16:47:48

我已经在Spring 3应用程序中注册了自定义转换服务。它适用于POJO,但它不适用于列表。

例如,我从 转换为,它工作正常,但不适用于 。StringRoleList<String>List<Role>

尝试注入列表时,应用程序中的各种飞翔,无论它们包含什么。转换服务为所有人调用 转换器 for 。ClassCastExceptionsList<String>List<Role>

如果您考虑一下,这是有道理的。类型擦除是这里的罪魁祸首,转换服务实际上看到了。ListList

有没有办法告诉转换服务使用泛型?

我还有哪些其他选择?


答案 1

在春季转换的另一种方法是 使用 。JavadocList<A>List<B>ConversionService#convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType)

此方法只需要一个 .Converter<A,B>

调用集合类型的转换服务:

List<A> source = Collections.emptyList();
TypeDescriptor sourceType = TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(A.class));
TypeDescriptor targetType = TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(B.class));
List<B> target = (List<B>) conversionService.convert(source, sourceType, targetType);

转换器:

public class ExampleConverter implements Converter<A, B> {
    @Override
    public B convert(A source) {
        //convert
    }
}

答案 2

我遇到了同样的问题,通过进行一些调查找到解决方案(对我有用)。如果你有两个类A和B,并且有一个注册的转换器,例如SomeConverter实现转换器,那么,要将A的列表转换为B的列表,你应该做下一步:

List<A> listOfA = ...
List<B> listOfB = (List<B>)conversionService.convert(listOfA,
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(A.class)),
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(B.class)));