首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MyBatis PersistenceException:實體類缺少無參建構子導致實例化失敗解決方案

     編輯:MySQL 資料庫相關知識

錯誤堆疊核心訊息


Caused by: java.lang.NoSuchMethodException: com.fendo.entity.Person.()
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(...)

根本原因

MyBatis 結果映射時,需透過**無參建構子** (Default Constructor) 實例化實體類,再透過 Setter/欄位注入屬性。若類別**僅定義有參建構子**或**無任何建構子但被標記為 `final`/私有**,則拋出此異常。

問題重現代碼


// 錯誤:只有有參建構子,編譯器不再自動生成無參建構子
public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {  // 唯一建構子
        this.name = name;
        this.age = age;
    }
    // Getter/Setter...
}

解決方案 (三選一)

方案一:显式新增無參建構子 (推薦,最簡單)


public class Person {
    private String name;
    private int age;
    
    public Person() {}  // 显式無參建構子
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // Getter/Setter...
}

方案二:使用 Lombok `@NoArgsConstructor` (自動生成)


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
}

方案三:配置 MyBatis 使用建構子注入 (進階)




    
        
        
        
    



需確保建構子參數名與 `` 一致 (啟用 `-parameters` 編譯選項或使用 `@Param`)。

最佳實踐檢查清單

  • 實體類 **必須有 public 無參建構子** (或 Lombok `@NoArgsConstructor`)
  • 屬性對應 **Getter/Setter** (或啟用 `mapUnderscoreToCamelCase` 自動映射)
  • 避免 `final` 類別/欄位 (除非配合建構子注入)
  • 內部類需 `static` 且有無參建構子
  • 泛型類型擦除導致實例化失敗時,指定 `resultType` 具體類

延伸:其他常見 PersistenceException 原因

錯誤訊息關鍵字可能原因解決
Could not set parameters for mapping參數型別不匹配 / 缺少 TypeHandler檢查 `#{param, jdbcType=...}`、自訂 TypeHandler
Invalid bound statement (not found)Mapper XML 未掃描 / namespace 錯誤 / id 拼寫檢查 `mapper-locations`、namespace=介面全限定名
Column 'xxx' not foundSQL 查詢欄位與 resultMap/resultType 不符補全 SELECT 列、別名對應、resultMap 映射

「NoSuchMethodException: ()」是 MyBatis 實體映射最基礎也最常見的坑,**養成實體類必寫無參建構子**的習慣即可徹底避免。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved