Абстрактный класс Custom десериализации для RestController - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть абстрактный класс PluginTemplate, унаследованный от 3 дочерних классов

PluginTemplateA, PluginTemplateB, PluginTemplateC.

У меня есть другой класс, в котором есть карта со списком PluginTemplate.

    @JsonDeserialize(using = PluginDeserializer.class)
    public class PluginContainer {
        // map stores enum to template list mapping, enum can be used to identify template type
        Map<PluginTemplateEnum, List<PluginTemplate>> pluginTemplatesList;
        other variables....
    }

Я отправляю объект PluginContainer по почтовому запросу в другой сервис, который использует RestController

    @RequestMapping(value = "/plugin/generateDetails", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public String generateDetails(@PathVariable Long interfaceId, @RequestBody List<PluginContainer> containers) throws Exception {
        // other code
    }

Я знаю, что для отправки json мне понадобится специальный десериализатор json для абстрактного класса PluginTemplate.

Я начал писать десериализатор json, подобный этому

public class PluginDeserializer extends JsonDeserializer<PluginContainer> {
    @Override
    public PluginContainer deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException {
        // what should I write here
    }
}

Как определить тип PluginContainer с помощью значения ключа Map и соответствующим образом десериализовать его в этом методе ,

1 Ответ

0 голосов
/ 29 апреля 2020

Перебирайте ключи TreeNode или напрямую получайте значение (TreeNode), используя TreeNode.get

 public PluginContainer deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException {
        TreeNode treeNode = jp.getCodec().readTree(jp);
        Iterator<String> nameItr = treeNode.fieldNames();
        while(nameItr.hasNext()) {  //Iteratae Over keys
            String key = nameItr.next();
        }
        //or you can just get the required value for key
        //i.e.
        treeNode.get("fieldName");

    }
...