java - sometimes - spring boot jsonignore




Solo se usa @JsonIgnore durante la serialización, pero no la deserialización (4)

Desde la versión 2.6: una forma más intuitiva es usar la anotación com.fasterxml.jackson.annotation.JsonProperty 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 necesite al revés, simplemente use Access.READ_ONLY .

Tengo un objeto de usuario que se envía desde y hacia el servidor. Cuando envío el objeto de usuario, no deseo enviar la contraseña con hash al cliente. Así que agregué @JsonIgnore en la propiedad de la contraseña, pero esto también impide que se deserialice en la contraseña, lo que dificulta el @JsonIgnore de usuarios cuando no tienen una contraseña.

¿Cómo puedo hacer que @JsonIgnore aplique a la serialización y no a la deserialización? Estoy usando Spring JSONView por lo que no tengo un montón de control sobre el ObjectMapper .

Cosas que he probado:

  1. Añadir @JsonIgnore a la propiedad
  2. Agregar @JsonIgnore en el método getter

En mi caso, tengo que Jackson serializa / deserializa automáticamente los objetos que devuelvo de un controlador Spring MVC (estoy usando @RestController con Spring 4.1.6). Tuve que usar com.fasterxml.jackson.annotation.JsonIgnore lugar de org.codehaus.jackson.annotate.JsonIgnore , de lo contrario simplemente no hizo nada.


Para lograr esto, todo lo que necesitamos son dos anotaciones:

  1. @JsonIgnore
  2. @JsonProperty

Use @JsonIgnore en el miembro de la clase y su captador. Use @JsonProperty en su setter.

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(String password) {
    this.password = password;
 }
}

"user": {
        "firstName": "Musa",
        "lastName": "Aliyev",
        "email": "[email protected]",
        "passwordIn": "98989898", (or encoded version in front if we not using https)
        "country": "Azeribaijan",
        "phone": "+994707702747"
    }
@CrossOrigin(methods=RequestMethod.POST)
@RequestMapping("/public/register")
public @ResponseBody MsgKit registerNewUsert(@RequestBody User u){

        root.registerUser(u);

    return new MsgKit("registered");
}  
@Service
@Transactional
public class RootBsn {

    @Autowired UserRepository userRepo;

    public void registerUser(User u) throws Exception{

        u.setPassword(u.getPasswordIn());
        //Generate some salt and  setPassword (encoded -  salt+password)
        User u=userRepo.save(u);

        System.out.println("Registration information saved");
    }

}
    @Entity        
@JsonIgnoreProperties({"recordDate","modificationDate","status","createdBy","modifiedBy","salt","password"})
                    public class User implements Serializable {
                        private static final long serialVersionUID = 1L;

                        @Id
                        @GeneratedValue(strategy=GenerationType.AUTO)
                        private Long id;

                        private String country;

                        @Column(name="CREATED_BY")
                        private String createdBy;

                        private String email;

                        @Column(name="FIRST_NAME")
                        private String firstName;

                        @Column(name="LAST_LOGIN_DATE")
                        private Timestamp lastLoginDate;

                        @Column(name="LAST_NAME")
                        private String lastName;

                        @Column(name="MODIFICATION_DATE")
                        private Timestamp modificationDate;

                        @Column(name="MODIFIED_BY")
                        private String modifiedBy;

                        private String password;

                        @Transient
                        private String passwordIn;

                        private String phone;

                        @Column(name="RECORD_DATE")
                        private Timestamp recordDate;

                        private String salt;

                        private String status;

                        @Column(name="USER_STATUS")
                        private String userStatus;

                        public User() {
                        }
                // getters and setters
                }




jackson