2016-05-16 1 views
1

Ich brauche die leere Zeichenfolge ("") als null in Spring MVC zu behandeln. Dies, weil ich festgestellt habe, dass, wenn ich ein Formularfeld (mit Angulars ng-Modell) bearbeite, das ursprünglich undefined war, dann lösche ich es auf leer, wird Angular diese Bean-Eigenschaft als leere Zeichenfolge senden. Wenn ich einen solchen Nullwert nicht berühre, wird er nicht in der JSON-Nutzlast gesendet und daher als null behandelt.Jackson ignoriert ACCEPT_EMPTY_STRING_AS_NULL_OBJECT

Ich habe Jackson mit der ACCEPT_EMPTY_STRING_AS_NULL_OBJECTDeserializationFeature in meinem Frühling Kontext konfiguriert. Konfiguration unten:

Noch sieht es so aus, als dekodiert es leere Strings als leere Strings und nicht als null. Ich habe debugged und ich konnte "" in der Nutzlast sehen. Hier ist ein Beispiel von einer Admin-Seite

{ 
    "id":"ADMIN.NOTIFIER_SMTP", 
    "host":"aa.bb.cc", 
    "protocol":"POP", 
    "securityProtocol":"PLAIN", 
    "username":"", <----- shall be null on server, I don't care about client 
    "passwordSet":false 
} 

Frage ist: ist etwas falsch in meiner Konfiguration? Wie sage ich Jackson, dass er leer als null behandeln soll?

Antwort

1

Mai werden Sie ein CustomObjectMapper

schreiben wollen
<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="custom.CustomObjectMapper"/> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

und fügen Sie oben deserializer in es hinzu.

0

Jackson gibt Ihnen Null für andere Objekte, aber für String gibt es leere String.

Aber Sie können einen benutzerdefinierten JsonDeserializer, dies zu tun:

class CustomDeserializer extends JsonDeserializer<String> { 

@Override 
public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException { 
    JsonNode node = jsonParser.readValueAs(String.class); 
    if (node.asText().isEmpty()) { 
     return null; 
    } 
    return node.toString(); 
}} 

In der Klasse Sie es für Standortfeld verwenden muß:

class EventBean { 
    public Long eventId; 
    public String title; 

    @JsonDeserialize(using = CustomDeserializer.class) 
    public String location; 
} 
+0

Tut mir leid, mit @ JsonDeserialize auf jede Eigenschaft ist eine schreckliche Vorgehensweise! Ich habe viele "String" -Eigenschaften. Vielleicht sollte ich einen solchen Deserialisierer als Global ... auf irgendeine Art fördern –