Только с помощью @JsonIgnore во время сериализации, но не десериализации
у меня есть объект пользователя, который отправляется на сервер. Когда я отправляю объект пользователя, я не хочу отправлять хэшированный пароль клиенту. Поэтому я добавил @JsonIgnore
в свойстве password, но это также блокирует его десериализацию в Пароль, что затрудняет регистрацию пользователей, когда у них нет пароля.
как я могу получить только @JsonIgnore
чтобы применить к сериализации, а не десериализации? Я использую Spring JSONView, поэтому у меня нет тонны контроля через ObjectMapper
.
вещи, которые я пробовал:
- добавить
@JsonIgnore
в собственность - добавить
@JsonIgnore
только на методе getter
5 ответов:
точно, как это сделать, зависит от версии Джексона, которую вы используете. Это изменилось вокруг версии 1.9, до этого, вы могли бы сделать это путем добавления
@JsonIgnore
в геттер.который вы пробовали:
добавить @JsonIgnore только для метода getter
этого и добавить
@JsonProperty
аннотация для вашего имени Поля JSON "пароль" к методу setter для пароля на вашем объект.более поздние версии Джексона добавили
READ_ONLY
иWRITE_ONLY
аргументы аннотацииJsonProperty
. Так что вы также можете сделать что-то вроде:@JsonProperty(access = Access.WRITE_ONLY) private String password;
документы можно найти здесь.
для того, чтобы сделать это, все, что нам нужно, это две аннотации :
@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; } }
начиная с версии 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
.
в моем случае у меня есть Джексон автоматически сериализует / десериализует объекты, которые я возвращаю из контроллера Spring MVC (я использую @RestController с Spring 4.1.6). Я должен был использовать
com.fasterxml.jackson.annotation.JsonIgnore
вместоorg.codehaus.jackson.annotate.JsonIgnore
, иначе он просто ничего не делал.
"user": { "firstName": "Musa", "lastName": "Aliyev", "email": "klaudi2012@gmail.com", "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 }