Webflux webclient и универсальные типы - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать универсальный класс, который будет использовать API REST. API возвращает списки объектов в зависимости от URL.

Я построил общий класс

public class RestConsumer<T> {
    WebClient client;

    public RestConsumer(){
        //Initialize client
    }

    public List<T> getList(String relativeUrl){
        try{
            return client
                .get()
                .uri(relativeUrl)
                .retrieve()
                .bodyToMono(new ParameterizeTypeReference<List<T>> (){}
                .block()
        catch(Exception e){}
}

}

Проблема в том, что T заменяется на Object во время компиляции, и все это возвращает список LinkedHashMap вместо списка T. Я пробовал много обходных путей, но не повезло. Есть предложения?

1 Ответ

0 голосов
/ 26 ноября 2018

Создайте класс (скажем, CollectionT) и добавьте список T в качестве атрибута.Затем Вы можете легко преобразовать его в Mono, который, .map (x -> x.getList ()) вернет Mono of List of T. Это также делает ваш код более неблокирующим, избегая, .block ()

Вот код: ->

public class CollectionT {

   private List<T> data;

   //getters
   public List<T> getData(){
    return data;
   }

   //setters
     ...
}

public class RestConsumer<T> {
    WebClient client = WebClient.create();

    public RestConsumer(){
        //Initialize client
    }

        public List<T> getList(String relativeUrl){

                return client
                    .get()
                    .uri(relativeUrl)
                    .retrieve()
                    .bodyToMono(CollectionT.class)
                    .map(x -> x.getData());

    }
}
...