Jackson Mapper - как потерпеть неудачу на пустых или пустых значениях

Мы используем Jackson JSON mapper в нашем коде для десериализации некоторых объектов конфигурации. Мы бы хотели, чтобы Джексон потерпел неудачу при десериализации, когда определенные поля отсутствуют или пусты

Единственная функция в Джексоне, поддерживающая это поведение, предназначена для примитивов:

final DeserializationConfig.Feature failOnPremitives = DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES;

Дело в том, что рассматриваемые поля в основном строки

Любая помощь высоко ценится

3 ответа

Решение

Есть опция под названием: FAIL_ON_NULL_FOR_CREATOR_PARAMETERS,

Поэтому я предполагаю, что это будет доступно по адресу: DeserializationConfig.Feature.FAIL_ON_NULL_FOR_CREATOR_PARAMETERS;

Или в yml :

jackson:
    serialization:
      indent-output: false
    deserialization:
      fail-on-unknown-properties: true
      fail-on-missing-creator-properties: true
      fail-on-null-creator-properties: true

Это работает для всех типов, строк, целых, двойных и т. Д.

Рассматривали ли вы проверку бобов?

В то время как Джексон сосредоточен на анализе JSON, Bean Validation - это все, что нужно для объявления и проверки ваших компонентов.

Вы могли бы использовать @NotNull или же @NotBlank из http://hibernate.org/validator/, эталонной реализации Bean Validation.


В качестве альтернативы вы можете использовать схему JSON.

Должен быть создан объектно-ориентированный пользовательский десериализатор.

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;

class JacksonDeserializerTest {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule("CustomPersonDeserializer", new Version(1, 0, 0, null, null, null));
        module.addDeserializer(Person.class, new CustomPersonDeserializer());
        mapper.registerModule(module);

        String jsonString = "{ \"id\": 1, \"name\": \"User 1 \"}";
        Person user = mapper.readValue(jsonString, Person.class);
        System.out.println("User: " + user.toString());

        jsonString = "{ \"id\": 1}";
        user = mapper.readValue(jsonString, Person.class);
    }

    static class CustomPersonDeserializer extends StdDeserializer<Person> {

        private static final long serialVersionUID = -4100181951833318756L;

        public CustomPersonDeserializer() {
            this(null);
        }

        public CustomPersonDeserializer(Class<?> vc) {
            super(vc);
        }

        @Override
        public Person deserialize(JsonParser parser, DeserializationContext deserializer) throws IOException, JsonProcessingException {
            Person person = new Person();
            ObjectCodec codec = parser.getCodec();
            JsonNode node = codec.readTree(parser);

            JsonNode idNode = node.get("id");
            int id = idNode.asInt();
            person.setId(id);

            JsonNode nameNode = node.get("name");
            if(nameNode == null){
                throw new IOException("name must be provided");
            }

            String name = nameNode.asText();
            if (name.trim().length() < 1){
                throw new IOException("name can not be empty");
            }

            person.setName(name);
            return person;
        }
    }

    static class Person {
        private int id;
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", id=" + id +
                    '}';
        }
    }
}

Альтернативный способ:
это работает и с объектами.

ObjectMapper mapper= new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Другие вопросы по тегам