2015-02-05 4 views
8

У меня есть класс, как это:Настройка Джексона бросить исключение, когда поле отсутствует

public class Person { 
    private String name; 
    public String getName(){ 
    return name; 
    } 
} 

Я использую ObjectMapper сконфигурированный так:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

У меня есть строка str что содержит это { "address" : "something" }. Обратите внимание, что в json нет поля «name». Если я сделаю что-то вроде этого:

mapper.readValue(str, Person.class); 

, то я действительно возвращаю объект Person с именем, установленным в null. Есть ли способ настроить mapper вместо исключения исключения или вернуть нулевую ссылку вместо Person? Я хочу, чтобы Джексон считал пропущенные поля неудачными и не хотел делать явные проверки null в полях результирующего объекта.

ответ

1

К сожалению, в данный момент Джексон не поддерживается.

Решение может заключаться в том, чтобы добавить подтверждение в свой конструктор. В идеале, если вы не хотите, чтобы эти значения были сериализованы как null, это означает, что вы не должны иметь их как нулевые (построенные другим способом). Например,

public class Person { 
    private String name; 
    public Person() { 
    checkNotNull(name); 
    } 
} 

однако это может не fittable во всех ситуациях, особенно если вы используете ваш объекта, кроме как через сериализации/десериализации.

Хотя у них есть атрибут required в аннотации @JsonProperty, он не поддерживается во время десериализации вообще и был введен только для украшения схем JSON. Смотрите эту topic

+0

Это не работает. Я пытаюсь сделать это сбой при отсутствующих свойствах вместо того, чтобы устанавливать их в null. Я не хочу, чтобы он терпел неудачу по неизвестным свойствам. – mushroom

+0

Жаль, что все было не так ясно. Я отредактировал ответ. – vtor

14

Как Джексон 2.6, там is a way, но он не работает на классе атрибутов аннотаций, только конструктор аннотаций:

/* DOES *NOT* THROW IF bar MISSING */ 
public class Foo {  
    @JsonProperty(value = "bar", required = true) 
    public int bar; 
} 

/* DOES THROW IF bar MISSING */ 
public class Foo { 
    public int bar; 
    @JsonCreator 
    public Foo(@JsonProperty(value = "bar", required = true) int bar) { 
     this.bar = bar; 
    } 
} 
+0

Будет ли это исключение, если оно не требуется и отсутствует? – aclokay

+0

Похоже, что '@ JsonCreator' не требуется предшествовать конструктору. (?) –

Смежные вопросы