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());
}