【问题标题】:Spring RestTemplate: how to define the parameter type in a generic classSpring RestTemplate:如何在泛型类中定义参数类型
【发布时间】:2017-01-10 14:56:35
【问题描述】:

我正在编写一个通用的 REST 客户端,用于不同类型的 DTO。

public abstract class GenericClient<DTO> {
  private final Class<DTO> dtoClass;
  ... ctor which sets dtoClass ...

  public DTO getOne(String id) {
    ...
    URI uri = ...
    ResponseEntity<DTO> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, dtoClass);
    return exchange.getBody(); // works
  }

  public List<DTO> findAll() {
    ...
    URI uri = ...
    ResponseEntity<List<DTO>> exchange = getRestTemplate()
      .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {});
    return exchange.getBody(); // fails with ClassCastException
  }
}

这是由几个像这样的具体客户端实现的

public class OneActualDTOClient extends GenericClient<OneActualDTO> {
  public OneActualDTOClient(){
    super(OneActualDTO.class);
  }
}

这编译,getOne 方法工作正常。但是对于findAll,在运行时,类型参数DTO是不可用的,所以exchange方法不能反序列化传入的JSON(据我了解)。

如您所见,我传递了具体的 DTO 类(作为 Class&lt;DTO&gt;)用于交换单个元素(getOne)。

我应该如何将 ParameterizedTypeReference 传递给 exchange 方法,以便在运行时知道返回为 List&lt;OneActualDTO&gt;

【问题讨论】:

    标签: java spring generics resttemplate


    【解决方案1】:

    所以我找到了一个解决方案,就是重写ParameterizedTypeReferencegetType 方法,返回一个自定义的ParameterizedType,如下所示:

    public abstract class GenericClient<DTO> {
      private final Class<DTO> dtoClass;
      ... ctor which sets dtoClass ...
    
    
      public List<DTO> findAll() {
        ...
        URI uri = ...
        ResponseEntity<List<DTO>> exchange = getRestTemplate()
          .exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference<List<DTO>() {
            @Override
            public Type getType() {
                return new ParameterizedType() {
                    @Override
                    public Type getRawType() {
                        return List.class;
                    }
    
                    @Override
                    public Type getOwnerType() {
                        return null;
                    }
    
                    @Override
                    public Type[] getActualTypeArguments() {
                        return new Type[]{dtoClass};
                    }
                };
            });
        return exchange.getBody(); // OK
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2014-03-26
      相关资源
      最近更新 更多