如何使用杰克逊制作自定义反序列化器将数字(即部门 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&lt;Integer&gt; id)... 来为您在数据库中提取数据 【参考方案1】:

您不需要自定义反序列化器。您可以添加一个参数构造函数,它采用int:

public Department() 


public Department(int deptId) 
    this.deptId = deptId;

它会自动反序列化为Department。反序列化后,如果需要,您需要进行额外的配置。

【讨论】:

以上是关于如何使用杰克逊制作自定义反序列化器将数字(即部门 ID)转换为部门对象?的主要内容,如果未能解决你的问题,请参考以下文章

我如何反序列化以杰克逊为单位的时间戳?

杰克逊,反序列化具有私有字段的类和没有注释的 arg-constructor

具有完整 POJO 数据绑定的杰克逊自定义过滤器

无法使用杰克逊反序列化包含 2 个具有相同 ID 的对象的 Json

如何删除杰克逊自定义序列化程序生成的空值?

如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用