用户定义的泛型类的Spring TypeDescriptor

时间:2016-08-19 20:14:24

标签: java spring generics type-erasure

我使用spring通用转换服务来构建用于进行SOAP / REST API调用的请求和响应。

我有两个转换器,它们将通用java类作为输入并将它们转换为相同的响应java类。 Spring的类型描述符本身用于解析参数类型,弹簧转换器调用适当的转换器类。

但这对用户定义的泛型类不起作用。以下是我的语法。

public class PairAConverter extends
    ConversionServiceAwareConverter<Pair<ClassA, Param>, Response> {

public class PairBConverter extends
    ConversionServiceAwareConverter<Pair<ClassB, Param>, Response> {

现在,当我使用以下语法调用转换器时:

Pair<ClassA, Param> pairA = Pair.of(classAObject, param);

TypeDescriptor fromType = TypeDescriptor.forObject(pairA); 

Response finalResponse = (Response) conversionService.convert(pairA, fromType,
    TypeDescriptor.valueOf(Response.class));

由于类型擦除,运行时调用对Pair类中的对象类型没有任何指示,并且始终调用错误的转换器。我看到这可用于Collection类,但没有用户定义的泛型类的功能。

有没有办法通过类型描述符获取泛型类的完整类详细信息?

1 个答案:

答案 0 :(得分:0)

不幸的是,TypeDescriptor不支持自定义对象中的泛型,它支持集合/映射中的泛型。 你可以做的是,使用你的泛型类型调用受保护的org.springframework.core.convert.TypeDescriptor#TypeDescriptor(org.springframework.core.ResolvableType, java.lang.Class<?>, java.lang.annotation.Annotation[])构造函数:

Constructor<TypeDescriptor> constructor = TypeDescriptor.class.getConstructor(ResolvableType.class, Class.class, Annotation[].class);
ResolvableType resolvableType = ResolvableType.forClassWithGenerics(Pair.class, ClassA.class, Param.class);
TypeDescriptor fromType = constructor.newInstance(resolvableType, Pair.class, null); //Assuming Pair doesn't have any annotations

然后你可以使用你的方法:

Response finalResponse = (Response) conversionService.convert(pairA, fromType,
TypeDescriptor.valueOf(Response.class));