-
Notifications
You must be signed in to change notification settings - Fork 41
Description
In my experience, it is quite common to have JSON documents whose properties are present/absent depending on the scenario in which they are used. For example, the following two JSON documents might both represent a user:
{
"firstName": "John",
"lastName": "Doe"
}{
"firstName": "John",
"middleInitial": "Q",
"lastName": "Public"
}I can easily map these documents to a Java class using the classic JavaBean pattern and JSON-B will be happy to deserialize either of the two documents above:
public class User {
private String firstName;
private String middleInitial;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleInitial() {
return middleInitial;
}
public void setMiddleInitial(String middleInitial) {
this.middleInitial = middleInitial;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}However, if I want to map these documents to a Java class using an immutable pattern leveraging the @JsonbCreator annotation, it is disallowed by the spec:
import javax.json.bind.annotation.JsonbCreator;
import javax.json.bind.annotation.JsonbProperty;
public class User {
private final String firstName;
private final String middleInitial;
private final String lastName;
@JsonbCreator
public User(@JsonbProperty("firstName") String firstName,
@JsonbProperty("middleInitial") String middleInitial,
@JsonbProperty("lastName") String lastName) {
this.firstName = firstName;
this.middleInitial = middleInitial;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getMiddleInitial() {
return middleInitial;
}
public String getLastName() {
return lastName;
}
}Section 4.5 say:
In case a field required for a parameter mapping doesn’t exist in JSON document, JsonbException MUST be thrown.
In my opinion, usage of @JsonbCreator should be compatible with any document that can otherwise be deserialized by the default mapping methods, so this spec requirement is at odds with Section 3.14, which says:
The deserialization operation of a property absent in JSON document MUST not set the value of the field, the setter (if available) MUST not be called, and thus original value of the field MUST be preserved.