Java Rest Client bodyToMono 泛型

问题描述

我的应用程序为不同的休息端点提供了一些服务。逻辑总是相同的,所以我想使用继承和泛型来避免代码重复。但是一行 (bodyToMono(E[].class)) 不起作用。有没有其他选择(也许是最佳实践方式),我看不到?

父类

@Configuration
@Service
public abstract class AbstractEntitiesRestService<E>{

   protected abstract String getBaseUrl();

   @Autowired
   @Qualifier("webClient")
   protected WebClient WebClient;

    @Override
    public E[] getobjectsFromCustomQueryImpl(CustomQuery query) {
        return jtWebClient.get()
                .uri(getBaseUrl())
                .retrieve()
                .bodyToMono(E[].class) <---- Error!
                .block();
    }
}

子类:

@Configuration
@Service
public class UserService extends AbstractEntitiesRestService<User> {

    @Value("${endpoint}")
    protected String baseUrl;

    @Override
    protected  String getBaseUrl(){
        return baseUrl;
    }
    
    ...

}

解决方法

数组 [] 不是类型,因此无法推广。

所以 T[].class 是一个错误,因为数组不是 class

您需要使用一个包含类型的类,因为类型可以是泛型的。例如ArrayList

@Override
public List<T> getObjectsFromCustomQueryImpl(CustomQuery query) {
    return jtWebClient.get()
            .uri(getBaseUrl())
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<List<T>>() {})
            .block();
}

ArrayListList<T> 接口的实现。但是我们不能放置一个包含泛型的接口,List<T>.class 也不会工作,所以 spring 有一个特定的类 ParameterizedTypeReference,它是一个在反/序列化过程中为你保存类型信息的类。