Как сделать собственный десериализатор, используя Джексона для преобразования числа (которое является идентификатором отдела) в объект отдела? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть класс User и Department, которые указывают на соответствующие таблицы в базе данных mysql (отношение «многие ко многим»). Я хочу создать собственный десериализатор для Список отделов в классе User.

мой POST Json выглядит так:

{ "userId": 1456, "firstName": "Дэвид", "второе имя": "", "lastName": "Бекхэм", "пол": "М", "rollNo": "", "семестр": 0, "раздел": "", "электронная почта": "david8@gmail.com", "пароль": "d123avid", «телефон»: «9844547852», «статус»: 0, "userType": 1, "userBio": "я преподаю статистику", "profilePicture": ноль, "доб": "1999-03-21", "facultyType": 1, "отделы": [109] }

Определение класса My User выглядит следующим образом:

@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: нет конструктора int / Int-аргумента / метода фабрики для десериализации из числового значения (109); Вложенное исключение: com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр com.maverick.project.entity.Department: нет конструктора int / Int-аргумента / фабричного метода для десериализации из числового значения (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;

1 Ответ

0 голосов
/ 19 марта 2019

Вам не нужен кастомный десериализатор.Вы можете добавить один аргумент конструктора, который принимает int:

public Department() {
}

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

И он будет автоматически десериализован в Department.После десериализации необходимо выполнить дополнительную настройку, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...