1. 程式人生 > 實用技巧 >Spring MVC 資料返回問題記錄

Spring MVC 資料返回問題記錄

Spring MVC 資料返回問題記錄

1. 返回值解析異常——“No converter found…”

  • 異常資訊:

    Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class com.example.demo.entity.Student]

  • 過程回顧:

    有一Student類,程式碼如下:

    /**
     * @author xzy
     * @date 2020-08-16 16:02
     * 說明:
     */
    public class Student {
        private String id;
        private String studentName;
        private String studentNo;
    
        public Student() {
        }
    
        public Student(String id, String studentName, String studentNo) {
            this.id = id;
            this.studentName = studentName;
            this.studentNo = studentNo;
        }
    }
    

    Controller類相關程式碼如下:

        @GetMapping("getStudent")
        public Student getStudent() {
            return new Student("sd8f9sd89f", "李白", "A10001");
        }
    
  • 問題分析:

    將某一物件作為返回值是,框架需要呼叫物件中的 get 方法,將物件解析成JSON格式。由於上述程式碼中的student類沒有定義任何 get 方法,因此資料解析失敗。

  • 解決辦法:

    為相關欄位新增get方法

    修改後的student類:

    /**
     * @author xzy
     * @date 2020-08-16 16:02
     * 說明:
     */
    public class Student {
        private String id;
        private String studentName;
        private String studentNo;
    
        public String getId() { return id;}
    
        public String getStudentName() { return studentName;}
    
        public String getStudentNo() { return studentNo;}
        
        public Student() {}
    
        public Student(String id, String studentName, String studentNo) {
            this.id = id;
            this.studentName = studentName;
            this.studentNo = studentNo;
        }
    }
    

    呼叫介面,接收到的資料如下:

    {
        "id": "sd8f9sd89f",
        "studentName": "李白",
        "studentNo": "A10001"
    }
    

2. 返回值解析異常——欄位缺失

  • 問題重現

    修改上文的Student類,原始碼如下:

    public class Student {
        private String id;
        private String studentName;
        private String studentNo;
    
        public String getId() { return id;}
    
        public String getStudentName() { return studentName;}
        
        // 注意:此處沒有為studentNo屬性設定對應的get方法
        
        public Student() {}
    
        public Student(String id, String studentName, String studentNo) {
            this.id = id;
            this.studentName = studentName;
            this.studentNo = studentNo;
        }
    }
    

    呼叫介面,接收到的資料如下:

    {
        "id": "sd8f9sd89f",
        "studentName": "李白"
    }
    

    從接收到的資料看,studentNo屬性的值並沒有被後端傳送出來。

  • 問題分析:

    將某一物件作為返回值是,框架會逐個呼叫物件中的 get 方法,將物件解析成JSON格式。由於上述程式碼的student類中沒有為studentNo屬性設定對應的get方法,因此,框架沒有將studentNo屬性的值解析到返回值中。

  • 解決辦法:

    為需要的欄位新增get方法。