首页 文章

仅在序列化期间使用@JsonIgnore,但不反序列化

提问于
浏览
250

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

我怎样才能将 @JsonIgnore 应用于序列化而不是反序列化?我'm using Spring JSONView so I don'对 ObjectMapper 有很大的控制权 .

我试过的事情:

  • @JsonIgnore 添加到酒店

  • 仅在getter方法上添加 @JsonIgnore

5 回答

  • 10

    究竟如何做到这一点取决于你正在使用的 Jackson 版本 . 这在版本1.9中发生了变化,在此之前,您可以通过将 @JsonIgnore 添加到getter来实现此目的 .

    你试过的:

    仅在getter方法上添加@JsonIgnore

    执行此操作,并将JSON "password"字段名称的特定 @JsonProperty 注释添加到对象密码的setter方法中 .

    更新版本的Jackson为 JsonProperty 添加了 READ_ONLYWRITE_ONLY 注释参数 . 所以你也可以这样做:

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

    可以找到文档here .

  • 377

    为了实现这一点,我们需要的只是两个注释:

    • @JsonIgnore

    • @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;
     }
    }
    
  • 87

    从版本2.6开始:更直观的方法是在字段上使用 com.fasterxml.jackson.annotation.JsonProperty 注释:

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

    即使存在getter,也会从序列化中排除字段值 .

    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 .

  • 2

    在我的情况下,我让Jackson自动序列化/反序列化我从Spring MVC控制器返回的对象(我在Spring 4.1.6中使用@RestController) . 我不得不使用 com.fasterxml.jackson.annotation.JsonIgnore 而不是 org.codehaus.jackson.annotate.JsonIgnore ,否则它什么也没做 .

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

相关问题