Java @OneToMany getter有时返回对象,有时返回ID(在数组中)

Java @OneToMany getter有时返回对象,有时返回ID(在数组中),java,json,spring-boot,jackson,Java,Json,Spring Boot,Jackson,从学校到老师,我有一种@OneToMany关系 如果我在前端加载教师,我会得到一份教师列表;但其中有些是对象ID而不是对象ID @OneToMany @JsonManagedReference(value = "teachers") @JsonIgnore // only admins private Set<Teacher> teachers = new HashSet<>(); 最后,控制器中的访问权限: @RequestMapping(value = "/{sch

从学校到老师,我有一种
@OneToMany
关系

如果我在前端加载教师,我会得到一份教师列表;但其中有些是对象ID而不是对象ID

@OneToMany
@JsonManagedReference(value = "teachers")
@JsonIgnore // only admins
private Set<Teacher> teachers = new HashSet<>();
最后,控制器中的访问权限:

@RequestMapping(value = "/{schoolId}/teacher", method = RequestMethod.GET)
public Set<Teacher> readTeacher(@PathVariable long schoolId, @RequestParam("teacher") long adminId) {
    School school = schoolRepository.findOne(schoolId);
    Teacher admin = teacherRepository.findOne(adminId);

    if (school == null) {
        throw new NotFoundException(School.class, schoolId);
    }
    if (admin == null) {
        throw new NotFoundException(Teacher.class, adminId);
    }

    if (!admin.isAdmin(school)) {
        throw new NoAccessRightException();
    }

    return school.getTeachers();
}
public class Controller {

   public Teachers readTeacher(...){
      ....
      return new Teachers(school.getTeachers());
   }
} 
另一个问题:我可以只对一个电话进行预测吗?

若要忽略,请尝试此操作

@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class MyClass {

     @JsonIgnore // only admins
     private Set<Teacher> teachers = new HashSet<>();

}
序列化程序:

public class TeachersSerializer extends JsonSerializer<Set<Teacher>> {
    @Override
    public void serialize(Set<Teacher> values, JsonGenerator jgen, SerializerProvider provider) throws IOException {
       jgen.writeStartArray();
       for (Teacher value : values) {
          jgen.writeStartObject();
          jgen.writeNumberField("id", value.getId());
          jgen.writeEndObject();
       }
       jgen.writeEndArray();
    }
}
在控制器中:

@RequestMapping(value = "/{schoolId}/teacher", method = RequestMethod.GET)
public Set<Teacher> readTeacher(@PathVariable long schoolId, @RequestParam("teacher") long adminId) {
    School school = schoolRepository.findOne(schoolId);
    Teacher admin = teacherRepository.findOne(adminId);

    if (school == null) {
        throw new NotFoundException(School.class, schoolId);
    }
    if (admin == null) {
        throw new NotFoundException(Teacher.class, adminId);
    }

    if (!admin.isAdmin(school)) {
        throw new NoAccessRightException();
    }

    return school.getTeachers();
}
public class Controller {

   public Teachers readTeacher(...){
      ....
      return new Teachers(school.getTeachers());
   }
} 

@罗曼克号;再次查看问题您正在实体类中使用Jackson、抛弃、Gson?@DouglasJunior Jacksonny添加
@JsonAutoDetect(getServiceability=JsonAutoDetect.Visibility.NONE,fieldVisibility=JsonAutoDetect.Visibility.ANY)
。问题是,我需要数据,但在这次调用中不需要,我的意思是| |如果我只加载一个教师,我需要数据-这个解决方案给出了吗?然后你可以实现一个自定义序列化程序,所以你只添加ID的子项。在序列化程序中,我可以从类中写入我需要的所有属性,对吗?是的。在这个例子中,我只是写了ID。对不起,我以为你会返回学校,但实际上你只返回教师名单。在这种情况下,您可以在课堂上设置序列化教师。我编辑了我的答案。
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Teachers implements Serializable {
     @JsonSerialize(using = TeachersSerializer.class)
     private Set<Teacher> teachers = new HashSet<>();

     public Teachers(Set<Teacher> teachers){
         this.teachers = teachers;
     }
}
public class Controller {

   public Teachers readTeacher(...){
      ....
      return new Teachers(school.getTeachers());
   }
}