【问题标题】:Spring TypeDescriptor for user defined generic class用户定义的泛型类的 Spring TypeDescriptor
【发布时间】:2018-03-23 06:31:57
【问题描述】:

我正在使用 spring 通用转换服务来构造请求和响应以进行 SOAP/REST API 调用。

我有两个转换器,它们将通用 java 类作为输入并将它们转换为相同的响应 java 类。 Spring 的类型描述符固有地用于解析参数类型,并且 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 类,但对于用户定义的泛型类没有功能。

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

【问题讨论】:

    标签: java spring generics type-erasure


    【解决方案1】:

    不幸的是,TypeDescriptor 不支持自定义对象中的泛型,它支持集合/映射中的泛型。 您可以做的是,使用您的泛型类型调用受保护的org.springframework.core.convert.TypeDescriptor#TypeDescriptor(org.springframework.core.ResolvableType, java.lang.Class&lt;?&gt;, 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));
    

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2012-11-08
      相关资源
      最近更新 更多