Jackson属性映射问题:Access.WRITE_ONLY注解不生效导致id序列化丢失
为什么Jackson序列化时不输出id属性?
运行Main类的结果如下:
{id=1, name=Marcelo, email=test@gmail.com, password=123456, token=t1234, refre ...} {id=1, name=Marcelo, email=test@gmail.com, password=null, enable=true} propertie id > {"name":"Marcelo","email":"test@gmail.com","enable":true}
问题出在id属性的映射配置上,该属性添加了如下注解:
@JsonProperty(access = Access.WRITE_ONLY)
序列化时不会生成该属性及其对应值
当前使用的Jackson版本为2.13.0,该Bug在其他版本中也存在。
相关代码
Main.class
package com; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; public class Main { private ObjectMapper model; public Main() { model = modelMapper(); } public static void main(String[] args) { var main = new Main(); var userEntity = new User(); System.out.println(userEntity.toString()); var user = main.getModel().convertValue(userEntity, UserDTO.class); System.out.println(user.toString()); try { System.out.println(main.getModel().writeValueAsString(user)); } catch (JsonProcessingException e) { e.printStackTrace(); } } public ObjectMapper getModel() { return model; } private ObjectMapper modelMapper() { var model = new ObjectMapper(); model.registerModule(new SimpleModule()); model.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); model.setSerializationInclusion(JsonInclude.Include.NON_ABSENT); model.configure(SerializationFeature.USE_EQUALITY_FOR_OBJECT_ID, false); return model; } }
UserDTO.class
package com; import java.io.Serializable; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty.Access; public class UserDTO implements Serializable { private static final long serialVersionUID = 1L; @JsonProperty(access = Access.WRITE_ONLY) private Long id; private String name; private String email; @JsonProperty(access = Access.READ_ONLY) private String password; private Boolean enable = false; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Boolean getEnable() { return enable; } public void setEnable(Boolean enable) { this.enable = enable; } @Override public int hashCode() { return Objects.hash(id); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; UserDTO other = (UserDTO) obj; return Objects.equals(id, other.id); } @Override public String toString() { return "{id=" + id + ", name=" + name + ", email=" + email + ", password=" + password + ", enable=" + enable + "}"; } }
User.class
package com; import java.io.Serializable; import java.util.Date; import java.util.Objects; public class User implements Serializable { private static final long serialVersionUID = 1L; private Long id = 1L; private String name = "Marcelo"; private String email = "test@gmail.com"; private String password = "123456"; private String token = "t1234"; private String refresh = "t2345"; private Boolean enable = true; private Boolean hashAble = true; private Date dataLastChange = new Date(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getRefresh() { return refresh; } public void setRefresh(String refresh) { this.refresh = refresh; } public Boolean getEnable() { return enable; } public void setEnable(Boolean enable) { this.enable = enable; } public Boolean getHashAble() { return hashAble; } public void setHashAble(Boolean hashAble) { this.hashAble = hashAble; } public Date getDataLastChange() { return dataLastChange; } public void setDataLastChange(Date dataLastChange) { this.dataLastChange = dataLastChange; } @Override public int hashCode() { return Objects.hash(id); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; return Objects.equals(id, other.id); } @Override public String toString() { return "{id=" + id + ", name=" + name + ", email=" + email + ", password=" + password + ", token=" + token + ", refresh=" + refresh + ", enable=" + enable + ", hashAble=" + hashAble + ", dataLastChange=" + dataLastChange + "}"; } }
内容的提问来源于stack exchange,提问作者Marcelo Ferreira
相关产品推荐
相关产品推荐

