Usar solo @JsonIgnore durante la serialización, pero no la deserialización
Tengo un objeto de usuario que se envía hacia y desde el servidor. Cuando envío el objeto de usuario, no quiero enviar la contraseña hash al cliente. Entonces, agregué @JsonIgnore
la propiedad de contraseña, pero esto también impide que se deserialice en la contraseña, lo que dificulta el registro de usuarios cuando no tienen una contraseña.
¿Cómo puedo @JsonIgnore
aplicar solo a la serialización y no a la deserialización? Estoy usando Spring JSONView, por lo que no tengo mucho control sobre el archivo ObjectMapper
.
Cosas que he probado:
- Añadir
@JsonIgnore
a la propiedad - Agregue
@JsonIgnore
solo el método getter
Exactamente cómo hacer esto depende de la versión de Jackson que estés usando. Esto cambió alrededor de la versión 1.9 ; antes de eso, podía hacer esto agregando @JsonIgnore
al captador.
Que has probado:
Agregue @JsonIgnore solo en el método getter
Haga esto y también agregue una @JsonProperty
anotación específica para el nombre de su campo JSON "contraseña" al método de configuración para la contraseña de su objeto.
Versiones más recientes de Jackson han agregado READ_ONLY
argumentos WRITE_ONLY
de anotación a favor JsonProperty
. Entonces también podrías hacer algo como:
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
Los documentos se pueden encontrar aquí .
Para lograr esto, todo lo que necesitamos son dos anotaciones:
@JsonIgnore
@JsonProperty
Úselo @JsonIgnore
en el miembro de la clase, su captador y @JsonProperty
su definidor. Una ilustración de ejemplo ayudaría a hacer esto:
class User {
// More fields here
@JsonIgnore
private String password;
@JsonIgnore
public String getPassword() {
return password;
}
@JsonProperty
public void setPassword(final String password) {
this.password = password;
}
}
Desde la versión 2.6: una forma más intuitiva es utilizar la com.fasterxml.jackson.annotation.JsonProperty
anotación en el campo:
@JsonProperty(access = Access.WRITE_ONLY)
private String myField;
Incluso si existe un captador, el valor del campo se excluye de la serialización.
JavaDoc dice:
/**
* Access setting that means that the property may only be written (set)
* for deserialization,
* but will not be read (get) on serialization, that is, the value of the property
* is not included in serialization.
*/
WRITE_ONLY
En caso de que lo necesites al revés, simplemente usa Access.READ_ONLY
.
En mi caso, tengo a Jackson (des) serializando automáticamente los objetos que devuelvo desde un controlador Spring MVC (estoy usando @RestController con Spring 4.1.6). Tuve que usar com.fasterxml.jackson.annotation.JsonIgnore
en lugar de org.codehaus.jackson.annotate.JsonIgnore
, de lo contrario, simplemente no hizo nada.
Otra forma sencilla de manejar esto es utilizar el argumento allowSetters = true
en la anotación. Esto permitirá que la contraseña se deserialice en su dto pero no la serializará en un cuerpo de respuesta que utilice un objeto contiene.
ejemplo:
@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
String foo;
String bar;
}
Ambos foo
y bar
se completan en el objeto, pero solo foo se escribe en el cuerpo de una respuesta.