id=123 正常注入 Long id。id=123,456,789 導致類型轉換異常,因 Struts2 嘗試將字符串 "123,456,789" 直接轉為 Long。Struts2 默認類型轉換器不支持「逗號分隔字符串 → Long 數組/集合」的自動轉換。
public class ResumeAction extends BaseModelAction {
private String idList; // 接收 "123,456,789"
public String batchDelete() {
if (idList != null && !idList.isEmpty()) {
String[] ids = idList.split(",");
for (String idStr : ids) {
Long id = Long.valueOf(idStr.trim());
resumeService.deleteById(id);
}
}
return "toList";
}
// getter/setter for idList
}
<s:form action="resume_batchDelete" method="post">
<s:iterator value="resumeList" var="resume">
<input type="checkbox" name="idList" value="<s:property value='id'/>" />
</s:iterator>
<input type="submit" value="批量刪除" />
</s:form>
所有勾選的 checkbox 同名 idList,提交時瀏覽器自動以逗號拼接。
public class StringToLongArrayConverter extends StrutsTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (toType == Long[].class || toType == long[].class) {
String[] arr = ((String[]) value)[0].split(",");
Long[] result = new Long[arr.length];
for (int i = 0; i < arr.length; i++) result[i] = Long.valueOf(arr[i].trim());
return result;
}
return super.convertValue(context, value, toType);
}
}
在 xwork-conversion.properties 註冊:java.lang.Long[]=com.example.StringToLongArrayConverter。之後 Action 可直接用 Long[] ids 接收。
最簡做法:Action 加 String idList 手動分割。追求優雅可註冊全局轉換器,實現 Long[] 直接注入。