如何解决 MismatchedInputException: Cannot Construction instance of `java.util.HashSet` 异常

Sam*_*sha 1 json json-deserialization spring-boot jsonparser

在我的程序中,我尝试更新用户的电子邮件。但这给了我一个例外说

嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造实例java.util.HashSet

但是,当我通过添加技能和电子邮件更新用户时,它并没有给我这个例外。

我尝试创建一个默认构造函数,但它不起作用。我也尝试使用 Json Creator。它对我也不起作用。我可以看到问题是当我将技能集清空时,此异常正在上升。但我没有一个明确的想法,如何克服这个情况。

这是我的员工实体

@Entity
@Table(name = "Employee")
public class Employee implements Serializable{

    private static final long serialVersionUID = -3009157732242241606L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long emp_id;

    @Column(name = "emp_fname")
    private String emp_fname;

    @Column(name = "emp_lname")
    private String emp_lname;

    @Column(name = "emp_email")
    private String emp_email;

    @Column(name = "emp_dob")
    private Date emp_dob;

    @ManyToMany(cascade = CascadeType.MERGE)
    @JoinTable(name = "emp_skills",
            joinColumns = @JoinColumn(name = "emp_id", referencedColumnName = "emp_id"),
            inverseJoinColumns = @JoinColumn(name = "s_id",referencedColumnName = "s_id"))
    private Set<Skills> skills;

    protected Employee(){

    }


    public Employee(String emp_fname,String emp_lname,String emp_email,Date emp_dob){
        this.emp_fname = emp_fname;
        this.emp_lname = emp_lname;
        this.emp_email = emp_email;
        this.emp_dob = emp_dob;
    }

    public Employee(Long emp_id,String emp_fname,String emp_lname,String emp_email,Date emp_dob,Set<Skills> skills){
        this.emp_id = emp_id;
        this.emp_fname = emp_fname;
        this.emp_lname = emp_lname;
        this.emp_email = emp_email;
        this.emp_dob = emp_dob;
        this.skills = skills;
    }

//all the getters and setter
Run Code Online (Sandbox Code Playgroud)

这是我的技能实体

@Entity
@Table(name = "Skills")
public class Skills implements Serializable {

    private static final long serialVersionUID = -3009157732242241606L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long s_id;

    @Column(name = "s_name")
    private String s_name;


    @ManyToMany(mappedBy = "skills",cascade = CascadeType.ALL)
    @JsonIgnore
    private Set<Employee> employees;

    protected Skills(){

    }

    public Skills(String s_name){
        this.s_name = s_name;
    }

//all the getters and setter
Run Code Online (Sandbox Code Playgroud)

这是我更新用户的控制器类方法

@Autowired
    EmployeeRepository repository;

    @RequestMapping("/updateEmployee")
    @PostMapping("/updateEmployee")
    @CrossOrigin
    public void updateEmployee(@RequestBody Employee employee, BindingResult bindingResult){
        Employee empToBeUpdated = null;
        for (Employee emp : repository.findAll()){
            if (emp.getEmp_id()==employee.getEmp_id()){
                empToBeUpdated = emp;
            }
        }
        if (!employee.getEmp_fname().equals("")&&employee.getEmp_fname()!=null){
            empToBeUpdated.setEmp_fname(employee.getEmp_fname());
        }
        if (!employee.getEmp_lname().equals("")&&employee.getEmp_lname()!=null){
            empToBeUpdated.setEmp_lname(employee.getEmp_lname());
        }
        if (!employee.getEmp_email().equals("")&&employee.getEmp_email()!=null){
            empToBeUpdated.setEmp_email(employee.getEmp_email());
        }
        if (employee.getEmp_dob()!=null){
            empToBeUpdated.setEmp_dob(employee.getEmp_dob());
        }

        if (employee.getSkills()!= null){
            empToBeUpdated.setSkills(employee.getSkills());
        }

        repository.save(empToBeUpdated);

    }
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误

已解决[org.springframework.http.converter.HttpMessageNotReadableException:JSON解析错误:无法构造实例java.util.HashSet (尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法来从字符串值('')反序列化;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造实例java.util.HashSet(尽管至少存在一个 Creator):没有字符串参数构造函数/工厂方法从字符串值('')反序列化 [来源:(推回输入流);行:1,列:94](通过参考链:com.ems.assignment1.model.Employee[“skills”])]

Sam*_*sha 5

我面临的问题是,后端期望有一个技能集,但如果当用户没有从技能列表中选择任何技能时,前端会传递一个空字符串。如果用户没有从技能列表中选择任何技能,我通过从角度前端发送一个空数组解决了这个问题。

constructor(private apiService: ApiService) {
    this.nullSkills = [];
  }

if (this.form.controls.skillsSet.value == null || this.form.controls.skillsSet.value === '') {
      this.employee.skills = this.nullSkills;
    } else {
      this.employee.skills = this.form.controls.skillsSet.value;
    }
Run Code Online (Sandbox Code Playgroud)