2012-07-06 36 views
5

ricevo una stringa JSON codificato e poi decodificarlo in un POJO, come questo:convalida quando si decodifica JSON utilizzando Jackson

String json = ... 

final ObjectMapper mapper = new ObjectMapper(); 
MyPojo obj = mapper.readValue(json, MyPojo.class); 

Voglio essere in grado di convalidare questo ingresso, ma non sono sicuro qual è il "modo giusto" per farlo.
Diciamo MyPojo si definisce in questo modo:

@JsonIgnoreProperties(ignoreUnknown=true) 
class MyPojo { 
    public static enum Type { 
     One, 
     Two, 
     Three; 

     @JsonValue 
     public String value() { 
      return this.name().toLowerCase(); 
     } 
    } 

    private String id; 
    private Type type; 
    private String name; 

    public String getId() { 
     return this.id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Type getType() { 
     return this.type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Ci sono tre cose che voglio per convalidare:

  1. che tutti i membri hanno valori
  2. che il valore enum fa parte dell'enumerazione
  3. Prova alcuni o tutti i valori rispetto ad alcuni criteri (es .: lunghezza min o massima, valore minimo o numero uomo, espressione regolare, ecc.)

Se la convalida fallisce, voglio restituire un messaggio significativo e leggibile.

Per la prima e la terza problemi posso semplicemente controllare tutti i membri dell'oggetto e vedere se ce ne sono nulli, e se non li prova contro i criteri, ma questo approccio può ottenere lungo e complicato quando ci sono molti campi.

Per quanto riguarda il secondo problema, se il valore in ingresso non corrisponde a uno dei valori di enumerazione poi un JsonMappingException è lanciata, e così sono riuscito a fare questo:

try { 
    MyPojo obj = mapper.readValue(json, MyPojo.class); 
} 
catch (JsonMappingException e) { 
    return "invalid value for property: " + e.getPath().get(0).getFieldName(); 
} 

Ma come faccio ad ottenere il valore nell'input in modo che possa restituire: invalid value: VALUE for property: PROPERTY?

Grazie.

risposta

1

Si consiglia di utilizzare un'implementazione di JSR-303 Bean Validation. Questa specifica definisce un insieme di annotazioni e file di configurazione XML per specificare i vincoli che si desidera convalidare sul proprio dominio. L'implementazione di riferimento è disponibile qui:

+1

Grazie, questo sembra interessante e io il check-out, ma non è esattamente quello che stavo cercando ... Mi chiedo se c'è un Jackson modo di convalidare almeno i primi 2 numeri che ho postato. –

Problemi correlati