Джексон, как сбой на НЕИЗВЕСТНЫХ свойствах - в отличие от DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

Мы используем Jackson XmlMapper и ObjectMapper для разбора файлов XML и JSON в объектные модели на Java.

Проблема в том, что мы также используем их для проверки (поймав xmlMapper.readValue(file, type), возвращая IOExeception, что файл, переданный для анализа, соответствует модели (пока есть необходимые поля модели, нас не волнуют неизвестные свойства - пока все объект не будет возвращен как null во всех его свойствах.

Таким образом, использование xmlMapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) не совсем подходит для нас, так как не удается выполнить сопоставление, если есть неизвестные атрибуты, которые мы не хотели сопоставлять (или знаем о них, или они не всегда отображаются).

Тем не менее, мы ВСЕ ЕЩЕ хотели бы, чтобы сопоставление завершилось неудачно, ЕСЛИ объект, на который мы сопоставляем, становится нулевым (например, файл xml, переданный для сопоставления, совсем не похож на правильную структуру, например: он начинается с корневого элемента, а модель, на которую мы сопоставляем, начинается с элемента и не имеет страниц нигде в XML.

Основной класс модели помечен как @JacksonXmlRootElement(localName = "ResultsSession"), а все необходимые нам атрибуты помечены как @JacksonXmlProperty(localName = "someValue") или (isAttribute = true).

Имеет ли это смысл? Есть ли способ убедиться, что сопоставленный объект содержит корневой элемент, не вызывая отказ или неизвестные свойства?


person Carmageddon    schedule 16.10.2020    source источник


Ответы (1)


Я нашел приемлемое решение, которое хорошо работает. Правильный способ сделать это, хотя Java Bean Validator, что-то вроде строк:

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
Set<ConstraintViolation<Object> violations = validator.validate(mappedObject);
if (violations.size > 0 ) {
  for (ConstraintViolation<Object> violation : violations( {
    LOGGER.error(violation.getMessage());
  }
}

И проверяемый объект добавил бы что-то вроде: @NotNull(Message = "error message") к ключевым атрибутам, и это будет работать хорошо.

Ссылка: https://www.baeldung.com/javax-validation

person Carmageddon    schedule 16.10.2020