JSR-353 Hinzufügen von Nullwerten mit javax.json.JsonObjectBuilder

WIE die javax.json-Dokumentation vorschlägt, verwendet JsonObject die folgenden Builder:

JsonBuilderFactory factory = Json.createBuilderFactory(config);
 JsonObject value = factory.createObjectBuilder()
     .add("firstName", "John")
     .add("lastName", "Smith")
     .add("age", 25)
     .add("address", factory.createObjectBuilder()
         .add("streetAddress", "21 2nd Street")
         .add("city", "New York")
         .add("state", "NY")
         .add("postalCode", "10021"))
     .add("phoneNumber", factory.createArrayBuilder()
         .add(factory.createObjectBuilder()
             .add("type", "home")
             .add("number", "212 555-1234"))
         .add(factory.createObjectBuilder()
             .add("type", "fax")
             .add("number", "646 555-4567")))
     .build();

In diesem Beispiel werden Werte für die give-Schlüssel hinzugefügt. Im wirklichen Leben stammen die Werte wahrscheinlich von einem (Pojo) -Domänenobjekt wie:

JsonBuilderFactory factory = Json.createBuilderFactory(config);
 JsonObject value = factory.createObjectBuilder()
     .add("firstname", customer.getFirstame())
     .add("lastname", customer.getLastame())
     .add("age", customer.getAge())
     ....

Der JsonOBjectBuilder löst eine NPE aus, falls der Schlüssel oder Wert null ist. Falls der Kunde kein registriertes Alter hat, wirft der obige Code eine NPE.

Grundsätzlich muss ich für jedes Feld, das ich hinzufüge, prüfen, ob der Wert null ist oder nicht, und den tatsächlichen Wert hinzufügen. Andernfalls fügen Sie weder das Feld noch JsonValue.NULL für den Schlüssel hinzu. Dies verursacht viel (unerwünschtes) Boilerplate ...

In meinem Fall endete ich mit einer benutzerdefinierten JsonUtils-Klasse mit verschiedenen statischen Methoden wie:

public static void add(JsonObjectBuilder builder, String name, Long value) {
    if (value == null) {
        builder.add(name,  JsonValue.NULL);
    }
    else {
        builder.add(name, value);
    }
}

public static void add(JsonObjectBuilder builder, String name, String value) {
    if (value == null) {
        builder.add(name,  JsonValue.NULL);
    }
    else {
        builder.add(name, value);
    }
}

und dann anrufen:

builder = Json.createObjectBuilder();
JsonUtils.add(builder, "id", customer.getId());
JsonUtils.add(builder, "name", customer.getName());
JsonUtils.add(builder, "gender", customer.getGender());
builder.build()

Aber irgendwie fühlt sich das nicht richtig an. Warum bietet die javax.json keine einfachere Möglichkeit, Nullwerte hinzuzufügen (ohne wenn sonst Boilerplate), oder fehle ich etwas?

Mein Hauptkritikpunkt an der JSR-353 API ist, dass sie trotz allem sehr gut aussiehtfließend api (siehe oberstes Beispiel von apidoc) ist es aber in Wirklichkeit nicht.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage