【问题标题】:Spring REST API is adding extra key-value pair in ResponseSpring REST API 在响应中添加额外的键值对
【发布时间】:2021-06-02 11:45:42
【问题描述】:

当我尝试使用 Postman 通过 Get Request 获取学生详细信息时,我得到了额外的键值对,即(实体:相同对象)。请帮助我理解为什么我会得到它,以及如何从我的回复中删除它。但是当我尝试打印在控制器类(第 1 行)中获取的对象时,它会显示正确的对象。

回应:

{
    "id": 2,
    "name": "ABC Person",
    "age": 28,
    "courses_id": 1,
    "entity": {
        "id": 2,
        "name": "ABC Person",
        "age": 28,
        "courses_id": 1
    }
}

获取请求网址:

http://localhost:8300/students/ABC Person

REST API 控制器类:

@RestController
public class StudentController {
    
    @Autowired
    private StudentService studentService;
    
    @GetMapping(value="/students/{name}")
    public ResponseEntity<StudentDTO> getStudentDetails(@PathVariable String name){
        StudentDTO student = studentService.getStudentDetails(name);
        System.out.println(student); // LINE 1
        return new ResponseEntity<>(student,HttpStatus.OK);
    }
}

学生DTO课:

public class StudentDTO {
    private int id;
    private String name;
    private int age;
    private int courses_id;

    //getter and setter methods

    public static StudentDTO valueOf(Student student) {
        StudentDTO studentDTO = new StudentDTO();
        
        studentDTO.setId(student.getId());
        studentDTO.setName(student.getName());
        studentDTO.setAge(student.getAge());
        studentDTO.setCourses_id(student.getCourses_id());
        
        return studentDTO;
    }
    
    public Student getEntity() {
        Student student = new Student();
        
        student.setId(this.id);
        student.setName(this.name);
        student.setAge(this.age);
        student.setCourses_id(this.courses_id);
        
        return student;
    }
}

【问题讨论】:

  • 你的StudentDTO 班级是什么样子的?
  • @DanielWosch 我已经编辑并添加了 StudentDTO 类 FYR。

标签: java spring-boot spring-restcontroller spring-rest


【解决方案1】:

getEntity 上方添加@JsonIgnore。因为 Jackson(spring 用作 messageconverter)会在默认情况下将对象序列化为 json 时选择 getter 方法。

@JsonIgnore
public Student getEntity() {
    Student student = new Student();
        
    student.setId(this.id);
    student.setName(this.name);
    student.setAge(this.age);
    student.setCourses_id(this.courses_id);
        
    return student;
}

看起来您正在尝试在 DTO 和 JPA 实体之间进行映射。为了避免在它们之间转换时出现样板代码,您可以使用 mapstruct、modelmapper 等映射库...

【讨论】:

  • 是的,它有效。但是你能检查一下我的理解是否正确。你说杰克逊会拿起所有的getter方法并将对象序列化为JSON。因为我有一个额外的 getter 方法,所以它也可以转换它。对吧?
  • 是的,默认情况下,jackson会序列化该类的所有getter方法。要跳过一个,您需要添加@JacksonIgnore。此外,您可以全局配置对象映射器以使用字段而不是 getter 并使其成为 spring bean:stackoverflow.com/questions/7105745/…
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
相关资源
最近更新 更多