Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JsonMappingException when using a Set instead of a List

I have a spring boot project with some entities, in specific, I have a Student Class with a DesiredCourses list which should be a Set<>.

When I use:

@OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
public List<StudentDesiredCourseEntity> getStudentDesiredCourses() {
    return studentDesiredCourses;
}

public void setStudentDesiredCourses(List<StudentDesiredCourseEntity> studentDesiredCourses) {
    this.studentDesiredCourses = studentDesiredCourses;
}

Everything works fine but when I use

@OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
public Set<StudentDesiredCourseEntity> getStudentDesiredCourses() {
    return studentDesiredCourses;
}

public void setStudentDesiredCourses(Set<StudentDesiredCourseEntity> studentDesiredCourses) {
    this.studentDesiredCourses = studentDesiredCourses;
}

I get

org.springframework.http.converter.HttpMessageNotReadableException",
"message":"Could not read JSON: (was java.lang.NullPointerException) (through reference chain: edu.cs6310.project4.entities.StudentEntity[\"studentDesiredCourses\"]->java.util.HashSet[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: edu.cs6310.project4.entities.StudentEntity[\"studentDesiredCourses\"]->java.util.HashSet[0])

Is there something I am missing or something extra that needs to be done?

As requested, the equals and hashcode

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof StudentDesiredCourseEntity)) return false;

    StudentDesiredCourseEntity that = (StudentDesiredCourseEntity) o;

    if (!course.equals(that.course)) return false;
    if (!priority.equals(that.priority)) return false;
    if (!student.equals(that.student)) return false;

    return true;
}

@Override
public int hashCode() {
    int result = priority.hashCode();
    result = 31 * result + course.hashCode();
    result = 31 * result + student.hashCode();
    return result;
}
like image 497
Daniel Esponda Avatar asked Apr 18 '15 19:04

Daniel Esponda


2 Answers

As mentioned by alexwen in comments, the reason this didn't work was due to not handling nulls in the hashcode/equals methods

like image 199
Daniel Esponda Avatar answered Sep 27 '22 20:09

Daniel Esponda


Jackson can't convert a json array into a hashSet. In order to do that, you need to create a custom Jackson Converter. Here is an example http://kdubblabs.com/java/retrofit-by-square/retrofit-using-jackson-json-conversion/

like image 22
Mostafa EL BARRAK Avatar answered Sep 27 '22 20:09

Mostafa EL BARRAK