2012-07-06 15 views
5

recibo una cadena JSON codificado y luego decodificarlo en un POJO, así:de validación cuando se decodifica usando JSON Jackson

String json = ... 

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

Quiero ser capaz de validar esta entrada, pero no estoy seguro ¿cuál es la "manera correcta" de hacerlo?
Digamos MyPojo se define así:

@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; 
    } 
} 

Hay tres cosas que quiero para validar:

  1. Que todos los miembros tienen valores
  2. Que el valor de enumeración es parte de la enumeración
  3. Pruebe algunos o todos los valores en función de algunos criterios (es decir, duración mínima o máxima, valor numérico mínimo o masculino, expresión regular, etc.)

Si la validación falla, deseo devolver un mensaje significativo y legible.

Para el primer y tercer problema, simplemente puedo verificar todos los miembros del objeto y ver si alguno es nulo, y si no los prueba con los criterios, pero este enfoque puede ser largo y complicado cuando hay muchos campos.

En cuanto a la segunda cuestión, si el valor de la entrada no coincide con uno de los valores de la enumeración luego se lanza un JsonMappingException, y así me las arreglé para hacer esto:

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

Pero ¿Cómo llego el valor en la entrada para que pueda devolver: invalid value: VALUE for property: PROPERTY?

Gracias.

Respuesta

1

Recomendaría utilizar una implementación de JSR-303 Bean Validation. Esta especificación define un conjunto de anotaciones y archivos de configuración XML para especificar las restricciones que desea validar en su dominio. La implementación de referencia está disponible aquí:

+1

Gracias, esto parece interesante y voy a echarle un vistazo, pero no es exactamente lo que estaba buscando ... Me pregunto si hay un Jackson forma de, al menos, validar los primeros 2 números que publiqué. –

Cuestiones relacionadas