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。
@ModelAttribute、MyBatis、Hibernate Validator)自動完成綁定與校驗。