Java - аннотации Джексона для обработки нет подходящего конструктора

Я использую Jackson ObjectMapper, чтобы прочитать мой ответ. Также я использую Spring ResponseErrorHandler для обработки этого ответа:

@Override
public void handleError(final ClientHttpResponse response) throws IOException {
objectMapper.readValue(response.getBody(), ServiceError.class);
}

Я знаю, что эту проблему можно решить, добавив конструктор по умолчанию, но я не могу этого сделать. Я не могу изменить класс ServiceError вообще.

Ошибка, полученная в следующем:

No suitable constructor found for type ... can not instantiate fromJSON object(need to add/enable type information?)

Есть ли какие-нибудь аннотации Джексона для поддержки такой проблемы?

2 ответа

Решение

Да, если у рассматриваемого класса есть подходящий конструктор, вы можете использовать @JsonCreator чтобы указать, что этот конструктор должен быть использован. Кроме того, если он принимает несколько аргументов, вам нужно будет добавить @JsonProperty чтобы указать, какое свойство JSON должно быть сопоставлено с каким аргументом.

Определить JsonDeserializer

public class ServiceErrorSerializer extends JsonDeserializer<ServiceError> {

    @Override
    public ServiceError deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {

        ServiceError serviceError = new ServiceError(null, null);

        ObjectCodec oc = jsonParser.getCodec();
        JsonNode node = oc.readTree(jsonParser);
        serviceError.setName(node.get("name").asText());
        serviceError.setDescription(node.get("description").asText());

        return serviceError;

    }
}

Затем зарегистрируйте его в вашем objectMapper

@Test
public void test1() throws Exception {
    ServiceError serviceError = new ServiceError("Noby Stiles", "good footballer");
    serviceError.setName("Noby Stiles");
    serviceError.setDescription("good footballer");
    String json = new ObjectMapper().writeValueAsString(serviceError);

    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addDeserializer(ServiceError.class, new ServiceErrorSerializer());
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(simpleModule);

    ServiceError serviceError2 = objectMapper.readValue(json, ServiceError.class);
    assertNotNull(serviceError2);
    assertEquals("Noby Stiles", serviceError2.getName());
}
Другие вопросы по тегам