2012-02-02 15 views
115

tengo una clase de entidad con un campo de contraseña:Jackson: cómo prevenir el campo de serialización

class User { 
    private String password; 

    //setter, getter.. 
} 

Quiero este campo para ser excluido del proceso de serialización. Pero todavía debería poder DESESALIZARSE. Esto es necesario, para que el cliente pueda enviarme una nueva contraseña, pero no pueda leer la actual.

¿Cómo logro esto con Jackson?

+1

¿No desea serializarla, pero quiere poder deserializarla? Eso es imposible, diría yo. Si no coloca una cookie en una caja, no podrá recuperarla de esta casilla. –

+1

@Traroth: pero puedo poner una NUEVA cookie. Solo estoy buscando una anotación conveniente, pero esto seguramente puede hacerse a mano. – weekens

+7

Comentario rápido: es completamente posible, técnicamente, tener un setter que se usa (incluso los privados son autodetectados), y simplemente omitir el acceso (sin campo público o getter). También es posible agregar '@ JsonIgnore' en getter, pero' @ JsonProperty' en setter, en cuyo caso las cosas no se serializan, pero se pueden deserializar. – StaxMan

Respuesta

135

Puede marcarlo como @JsonIgnore.

+6

@JsonIgnore previene la deserialización también. Para transitorio, lo verificare. – weekens

+86

Con 1.9, puede agregar '@ JsonIgnore' para getter,' @ JsonProperty' para setter, para deserializar pero no serializar. – StaxMan

+0

El comentario de StaxMan debería ser la respuesta, ¿no es así? ¿Por qué sigue siendo un comentario, entonces ...! ..? –

16

Aparte de @JsonIgnore, hay un par de otras posibilidades:

  • Uso JSON Views para filtrar campos de forma condicional (por defecto, no se utilizan para la deserialización; en 2.0 estará disponible, pero se pueden utilizar diferentes vistas en serialización, deserialización)
  • @JsonIgnoreProperties en clase puede ser útil
83

Ilustrando lo StaxMan ha indicado, esto funciona para mí

@JsonIgnore 
public String password; 

@JsonIgnore 
public String getPassword() { 
    return password; 
} 

@JsonProperty 
public void setPassword(String password) { 
    this.password = password; 
} 
+10

¿Qué dependencia de Json usas? Esto no funciona con com.fasterxml.jackson –

+3

¡Gracias! '@ JsonIgnore' no es necesario en el campo, parece. –

+0

com.fasterxml.jackson.annotation.JsonIgnore de jackson-anotations- .jar – mvmn

4

transient es la solución para mí. ¡Gracias! es nativo de Java y le evita agregar otra anotación específica del marco.

+1

Eso funciona si su atributo es realmente transitorio, no implica ORM, por ejemplo .... Encontré @JsonIgnore para ser más interesante en mi caso, aunque estaría bloqueado para jackson, pero es una buena compensación –

+3

No tiene para ser bloqueado a jackson si creas tu propia anotación y la anotas JsonIgnore y JacksonAnnotationsInside. De esta forma, si cambia los serializadores, solo tiene que cambiar su propia anotación. – DavidA

31

La manera fácil es anotar sus captadores y decodificadores.

Aquí está el ejemplo original modificado para excluir la contraseña de texto sin formato, pero luego anote un nuevo método que simplemente devuelve el campo de contraseña como texto cifrado.

class User { 
    private String password; 

    public void setPassword(String password){...} 
    @JsonIgnore 
    public String getPassword(){...} 

    @JsonProperty("password"} 
    public String getEncryptedPassword(){...} 
} 
3

Uno debe preguntar por qué quiere un método getter público para la contraseña. Hibernate, o cualquier otro marco ORM, lo hará con un método getter privado. Para verificar si la contraseña es correcta, puede usar

public boolean checkPassword(String password){ 
    return this.password.equals(anyHashingMethod(password)); 
} 
+0

De hecho, creo que esta es la mejor manera de pensar en la solución. Tiene más sentido hacer que las cosas que necesita sean privadas y controlarlas desde el objeto mismo. – arcynum

Cuestiones relacionadas