Как динамически изменить Type-Reference, передаваемую в readvalue Джексона? - PullRequest
0 голосов
/ 08 января 2019

У меня есть два типа TypeReferences, которые будут переданы в методе readValue Джексона.

1. Foo<AbstractResponse>
2. Foo <String>

Как сделать, чтобы Джексон считывал значение для работы, когда передается любая из этих двух ссылок

Поскольку я имею дело с вызовами Http, я попытался отправить пользовательские коды ошибок и на основе этого изменить ссылку на тип, передаваемую в метод readValue, который работает. Но я ищу более эффективное решение, чем это.

Чтобы сделать это, я могу использовать это:

mapper.readValue(jsonParser, new TypeReference<Foo<AbstractResponse>(){})

или это

mapper.readValue(jsonParser, new TypeReference<Foo<String>(){})

Но это то, что ожидается:

mapper.readValue(jsonParser, new new TypeReference<Foo<T>>() {})

1 Ответ

0 голосов
/ 08 января 2019
Метод

ObjectMapper readValue является универсальным методом. Обобщения разрешаются во время компиляции, поэтому вы не можете делать это динамически.

Предположим, у вас есть следующий метод:

Foo<T> <T> bar(parser, TypeReference<Foo<T>> reference) {
   ...
   return mapper.readValue(jsonParser, reference);
}

Вы не можете назвать это так:

TypeReference<Foo<T>> reference;
switch (value) {
     case "X":
          reference = new TypeReference<Foo<AbstractResponse>(){};
          break;
     case "Y":
          reference = new TypeReference<Foo<String>(){};
          break;
 }
 bar(parser, reference);

Но вы можете сделать следующее:

switch (value) {
     case "X":
          bar(parser, new TypeReference<Foo<AbstractResponse>(){});
          break;
     case "Y":
          bar(parser, new TypeReference<Foo<String>(){});
          break;
 }
...