在序列化过程中只使用@JsonIgnore,而不是反序列化

我有一个用户对象发送到服务器和从服务器。 当我发送用户对象时,我不想将散列的密码发送给客户端。 所以我在密码属性中添加了@JsonIgnore ,但是这也阻止了它被反序列化到密码中,这使得当用户没有密码时很难注册用户。

我怎样才能让@JsonIgnore适用于序列化而不是反序列化? 我正在使用Spring JSONView,所以我没有对ObjectMapper一大堆控制。

我试过的东西:

  1. @JsonIgnore添加到属性
  2. @JsonIgnore在getter方法上添加@JsonIgnore

究竟如何做到这一点取决于你使用的jackson的版本。 这个版本在版本1.9之前有所变化,在这之前,你可以通过向getter添加@JsonIgnore来实现。

你试过了:

仅在getter方法上添加@JsonIgnore

执行此操作, 为您的JSON“密码”字段名称添加一个特定的@JsonProperty注释到您的对象的密码设置方法。

Jackson的更新版本已经为JsonProperty添加了READ_ONLYWRITE_ONLY注解参数。 所以你也可以做这样的事情:

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

文档可以在这里find。

为了做到这一点,我们需要的是两个注释:

  1. @JsonIgnore
  2. @JsonProperty

在类成员和它的getter上使用@JsonIgnore 。 在其setter上使用@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

在我的情况下,我有jackson自动序列化/反序列化的对象,我从一个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 } 
 @JsonProperty(access = Access.WRITE_ONLY) private String password;