首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 反射自動封裝表單數據時的類型轉換陷阱:argument type mismatch 異常解決

     編輯:程式設計疑難解答

異常堆棧

java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...
    at Demon.servlet.servletDemo3.doGet(servletDemo3.java:39)

問題代碼片段

PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
Method setter = pd.getWriteMethod();
if (value.length == 1) {
    setter.invoke(u, value[0]); // 直接傳 String
} else {
    setter.invoke(u, (Object)value); // 傳 String[]
}

根本原因

HTTP 請求參數全部為 String 類型,但 User 實體類屬性可能是 Integer、Boolean、Date 等。反射調用 setter.invoke 時,參數類型必須與 setter 參數類型完全匹配(或可隱式轉換),否則拋出 argument type mismatch。

解決方案:類型轉換工具

public static Object convert(String value, Class targetType) {
    if (value == null || value.isEmpty()) return null;
    if (targetType == String.class) return value;
    if (targetType == Integer.class || targetType == int.class) return Integer.parseInt(value);
    if (targetType == Long.class || targetType == long.class) return Long.parseLong(value);
    if (targetType == Boolean.class || targetType == boolean.class) return Boolean.parseBoolean(value);
    if (targetType == Double.class || targetType == double.class) return Double.parseDouble(value);
    if (targetType == Date.class) return new SimpleDateFormat("yyyy-MM-dd").parse(value);
    // 更多類型...
    throw new IllegalArgumentException("Unsupported type: " + targetType);
}

修正後調用

Class paramType = setter.getParameterTypes()[0];
Object converted = convert(value[0], paramType);
setter.invoke(u, converted);

數組/集合屬性處理

若屬性為 String[] 或 List<String>,需將請求參數數組 value 直接傳入或轉換為 List。

最佳實踐

  • 使用成熟框架(Spring MVC @ModelAttribute、MyBatis、Hibernate Validator)自動完成綁定與校驗。
  • 手寫反射僅用於極簡場景,務必補全類型轉換邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved