Tengo una clase de entidad con un campo de contraseña:
class User {
private String password;
//setter, getter..
}
Quiero que este campo se omita durante la serialización. Pero aún debería ser capaz de DESserializar. 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?
@JsonIgnore
en getter, pero@JsonProperty
en setter, en cuyo caso las cosas no se serializan, pero se pueden deserializar.Respuestas:
Puedes marcarlo como
@JsonIgnore
.Con 1.9, puede agregar
@JsonIgnore
para getter,@JsonProperty
para setter, para deserializar pero no serializar.fuente
@JsonIgnore
para getter,@JsonProperty
para setter, para deserializar pero no serializar.transient
(como enprivate transient String password;
) pero los campos transitorios con captadores públicos se ignoran a menos que MapperFeature.PROPAGATE_TRANSIENT_MARKER esté habilitado.Ilustrando lo que StaxMan ha declarado, esto funciona para mí
fuente
@JsonIgnore
No es necesario en el campo, parece.La manera fácil es anotar sus captadores y establecedores.
Aquí está el ejemplo original modificado para excluir la contraseña de texto sin formato, pero luego anotar un nuevo método que solo devuelve el campo de contraseña como texto cifrado.
fuente
A partir de Jackson 2.6 , una propiedad se puede marcar como de solo lectura o escritura. Es más simple que hackear las anotaciones en ambos accesos y mantiene toda la información en un solo lugar:
fuente
Aparte de
@JsonIgnore
, hay un par de otras posibilidades:@JsonIgnoreProperties
en clase puede ser útilfuente
transient
Es la solución para mí. ¡Gracias! es nativo de Java y evita que agregue otra anotación específica del marco.fuente
Debería preguntarse por qué querría un método de obtención público para la contraseña. Hibernate, o cualquier otro marco ORM, funcionará con un método getter privado. Para verificar si la contraseña es correcta, puede usar
fuente
Jackson tiene una clase llamada SimpleBeanPropertyFilter que ayuda a filtrar campos durante la serialización y deserialización; No globalmente. Creo que eso es lo que querías.
Luego en tu código:
Esto evitará que el
password
campo se serialice. También podrá deserializar lospassword
campos tal como están. Solo asegúrese de que no se apliquen filtros en el objeto ObjectMapper.fuente
establecer variable como
@JsonIgnore
Esto permite que json serializer omita la variable
fuente