2015-02-05 23 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); 

然後我實際上返回一個名稱設置爲null的Person對象。有沒有辦法將映射器配置爲拋出異常,或返回空引用而不是Person?我希望傑克遜考慮錯過領域失敗,不想對結果對象的領域進行顯式的空檢查。

回答

1

不幸的是,此刻傑克遜不支持這一點。

解決方案可能是在您的構造函數中添加驗證。理想情況下,如果您不希望將這些值序列化爲空值,這確實意味着您不應該將它們視爲null(以其他方式構造)。例如,

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

然而,這可能並非在所有情況下裝嵌,特別是如果你正在使用你的對象不是通過序列化/反序列化等。

雖然它們在@JsonProperty註釋中有required屬性,但它在反序列化過程中根本不被支持,並且僅用於裝飾JSON模式。看到這個topic

+0

這沒有奏效。我正在嘗試使其失敗,而不是將它們設置爲null。我不希望它在未知屬性上失敗。 – mushroom 2015-02-11 18:10:09

+0

對不起,這是不明確的。我編輯了答案。 – vtor 2015-02-11 19:00:42

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 2016-10-30 10:07:25

+0

看起來'@ JsonCreator'不需要在構造函數之前。 (?) – 2017-12-01 20:58:49