【发布时间】:2022-01-03 16:29:57
【问题描述】:
为什么 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) 当 Serializable 不产生属性和你的价值时
jackson 2.13.0,但其他版本存在bug
在github上有项目模拟器的问题 Bug Jackson Serializable propertie
在此处显示代码
主类
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 + "}";
}
}
用户类
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 + "}";
}
}
【问题讨论】:
-
也许您应该澄清一下这些访问限制的原因。我认为使用这些存在一些误解。对我来说,代码的工作方式与文档中的一样。
标签: java serialization jackson