Пользовательский JsonDeserializer, использующий наследование, вызывает StackruError

У меня проблема с пользовательским JsonDeserializer. Я пытаюсь использовать разные реализации абстрактного класса в зависимости от сообщения JSON, полученного вызовом службы Rest (если данные Array использовать один, и если это String использовать другое):

@Path("/rest/cipher")
public interface CipherManager {

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Path("/encrypt")
    public Response cipher(AbstractCipherRequestBean jsonRequestData);
}

Десериализатор выглядит так:

public class CipherRequestDeserializer extends JsonDeserializer<AbstractCipherRequestBean> {

@Override
public AbstractCipherRequestBean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    ObjectMapper mapper = (ObjectMapper) jp.getCodec();
    ObjectNode root = (ObjectNode) mapper.readTree(jp);
    Class<? extends AbstractCipherRequestBean> abstractCipherRequestBeanClass = null;
    Iterator<Entry<String, JsonNode>> elementsIterator = root.getFields();
    while (elementsIterator.hasNext()) {
        Entry<String, JsonNode> element = elementsIterator.next();
        String name = element.getKey();
        if(name.equals("b64Data")){
            if(element.getValue().isArray()){
                abstractCipherRequestBeanClass = CipherMultRequestBean.class;
            }else{
                abstractCipherRequestBeanClass = CipherRequestBean.class;
            }
        }
    }
    if (abstractCipherRequestBeanClass == null){
        return null;
    }
    return mapper.readValue(root, abstractCipherRequestBeanClass);
}

}

Наследование следующее:

public class RequestBean {
    protected String b64Data;
    ...
}

@JsonDeserialize(using = CipherRequestDeserializer.class)
public abstract class AbstractCipherRequestBean extends RequestBean{
    ...
}

public class CipherRequestBean extends AbstractCipherRequestBean{
    ...
}

public class CipherMultRequestBean extends AbstractCipherRequestBean {
    private List<String> b64Data;
    ...
}

Я считаю, что поскольку обе реализации наследуют @JsonDeserialize аннотация, каждый звонок mapper.readValue(root, abstractCipherRequestBeanClass) называет deserialize метод снова, заканчивающийся в StackruError.

Есть ли способ избежать этого? Так как в конце я звоню mapper с реальным классом, я думал, что он будет использовать по умолчанию mapper реализация, а не CipherRequestDeserializer один.

1 ответ

Решение

Я наконец нашел решение. Достаточно просто аннотировать два моих подкласса:

@JsonDeserialize(as = CipherRequestBean.class)
public class CipherRequestBean extends AbstractCipherRequestBean{
...
}

@JsonDeserialize(as = CipherMultRequestBean.class)
public class CipherMultRequestBean extends AbstractCipherRequestBean {
private List<String> b64Data;
...
}
Другие вопросы по тегам