如何使用杰克逊制作自定义反序列化器将数字(即部门 ID)转换为部门对象?
Posted
技术标签:
【中文标题】如何使用杰克逊制作自定义反序列化器将数字(即部门 ID)转换为部门对象?【英文标题】:How to make a custom deserializer using jackson to convert a number(which is the department ID) to a department object? 【发布时间】:2019-08-09 14:29:35 【问题描述】:我有一个名为 User 和 Department 的类,它们指向 mysql 数据库中的各个表(多对多关系)。我想为 User 类中的 List 部门 创建一个自定义反序列化器。
我的 POST Json 看起来像这样:
“用户ID”:1456, “名字”:“大卫”, “中间名字”: ””, “姓氏”:“贝克汉姆”, “性别”:“M”, "rollNo": "", “学期”:0, “部分”: ””, “电子邮件”:“david8@gmail.com”, “密码”:“d123avid”, “电话”:“9844547852”, “状态”:0, “用户类型”:1, "userBio": "我教统计学", “个人资料图片”:空, “出生日期”:“1999-03-21”, “教师类型”:1, “部门”:[109]
我的用户类定义如下:
@Entity
@Table(name="user")
public class User
@Id
@Column(name="user_id")
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private long userId;
@Column(name="first_name")
private String firstName;
@Column(name="middle_name")
private String middleName;
@Column(name="last_name")
private String lastName;
@Column(name="gender")
private char gender;
@Column(name="roll")
private String rollNo;
@Column(name="semester")
private byte semester;
@Column(name="section")
private char section;
@Column(name="email")
private String email;
@Column(name="password")
private String password;
@Column(name="phone")
private String phone;
@Column(name="status")
private byte status;
@Column(name="user_type")
private byte userType;
@Column(name="user_bio")
private String userBio;
@Column(name="profile_picture")
private String profilePicture;
@Column(name="dob")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dob;
@Column(name="faculty_type")// 0 is for student, 1 for permanent and 2 for visiting
private byte facultyType;
//for join table
@ManyToMany(fetch=FetchType.EAGER,
cascade= CascadeType.PERSIST, CascadeType.MERGE,CascadeType.DETACH, CascadeType.REFRESH)
@JoinTable(
name="user_department",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="dept_id")
)
private List<Department> departments;
目前我收到一个错误提示
JSON 解析错误:无法构造 com.maverick.project.entity.Department 的实例:没有从数值 (109) 反序列化的 int/Int-argument 构造函数/工厂方法;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:无法构造 com.maverick.project.entity.Department 的实例:没有 int/Int-argument 构造函数/工厂方法从数值 (109) 反序列化
我的部门类定义如下:
@Entity
@Table(name="department")
public class Department
@Id
@Column(name="dept_id")
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private int deptId;
@Column(name="dept_name")
private String deptName;
@ManyToMany(fetch=FetchType.EAGER,
cascade= CascadeType.PERSIST, CascadeType.MERGE,CascadeType.DETACH, CascadeType.REFRESH)
@JoinTable(
name="user_department",
joinColumns=@JoinColumn(name="dept_id"),
inverseJoinColumns=@JoinColumn(name="user_id")
)
@JsonIgnore
private List<User> users;
【问题讨论】:
基本上,您需要一个方法setDepartments(List<Integer> id)...
来为您在数据库中提取数据
【参考方案1】:
您不需要自定义反序列化器。您可以添加一个参数构造函数,它采用int
:
public Department()
public Department(int deptId)
this.deptId = deptId;
它会自动反序列化为Department
。反序列化后,如果需要,您需要进行额外的配置。
【讨论】:
以上是关于如何使用杰克逊制作自定义反序列化器将数字(即部门 ID)转换为部门对象?的主要内容,如果未能解决你的问题,请参考以下文章
杰克逊,反序列化具有私有字段的类和没有注释的 arg-constructor