Только использование @JsonIgnore во время сериализации, но не десериализация

У меня есть пользовательский объект, который отправляется на сервер и с него. Когда я отправляю объект пользователя, я не хочу отправлять хешированный пароль клиенту. Поэтому я добавил @JsonIgnore в свойство пароля, но это также блокирует его десериализацию в пароле, что затрудняет регистрацию пользователей, когда у них нет пароля.

Как я могу получить @JsonIgnore только для сериализации, а не для десериализации? Я использую Spring JSONView, поэтому у меня нет тонны контроля над ObjectMapper.

Вещи, которые я пробовал:

  • Добавить @JsonIgnore в свойство
  • Добавить @JsonIgnore только для метода получения.

Ответ 1

Точно, как это сделать, зависит от версии Джексона, которую вы используете. Это изменилось примерно до версии 1.9, до этого вы могли бы сделать это, добавив @JsonIgnore к получателю.

Что вы пробовали:

Добавить @JsonIgnore только для метода getter

Сделайте это, а также добавьте конкретную аннотацию @JsonProperty для имени поля вашего пароля JSON к методу setter для пароля на вашем объекте.

В более поздних версиях Jackson добавлены аргументы аннотации READ_ONLY и WRITE_ONLY для JsonProperty. Таким образом, вы также можете сделать что-то вроде:

@JsonProperty(access = Access.WRITE_ONLY)
private String password;

Документы можно найти здесь.

Ответ 2

Чтобы выполнить это, все, что нам нужно, это две аннотации:

  • @JsonIgnore
  • @JsonProperty

Используйте @JsonIgnore для члена класса и его получателя. Используйте @JsonProperty для своего сеттера.

Пример иллюстрации поможет сделать это:

class User{

// More fields here
 @JsonIgnore
 private String password;

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

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

Ответ 3

Начиная с версии 2.6: более интуитивным способом является использование аннотации com.fasterxml.jackson.annotation.JsonProperty в поле:

@JsonProperty(access = Access.WRITE_ONLY)
private String myField;

Даже если геттер существует, значение поля исключается из сериализации.

JavaDoc говорит:

/**
 * 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

Если вам это нужно наоборот, просто используйте Access.READ_ONLY.

Ответ 4

В моем случае у меня есть автоматическая сериализация/десериализация объектов Jackson, возвращаемых с контроллера Spring MVC (я использую @RestController с Spring 4.1.6). Мне пришлось использовать com.fasterxml.jackson.annotation.JsonIgnore вместо org.codehaus.jackson.annotate.JsonIgnore, иначе просто ничего не делалось.

Ответ 5

"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
                }