Struts 2 通過 OGNL 表達式將請求參數自動填充到 Action 屬性。對於集合類型屬性(List、Set、Map),框架無法從泛型擦除後的字節碼獲取元素類型,導致類型轉換失敗或轉換為錯誤類型。
Action類名-conversion.propertiespackage com.example.action;
import java.util.List;
public class LoginAction {
private List users; // 無泛型或泛型擦除後無法識別元素類型
public List getUsers() { return users; }
public void setUsers(List users) { this.users = users; }
public String execute() { return "success"; }
}
# 語法:Element_屬性名 = 元素全限定類名
Element_users=com.example.domain.User
Struts 2 將請求參數轉換為 List<User>,每個元素自動實例化為 User 對象並調用其 setter 填充屬性。
public class ProductAction {
private Map productMap; // Map 或 Map
public Map getProductMap() { return productMap; }
public void setProductMap(Map productMap) { this.productMap = productMap; }
}
# Map Key 類型:Key_屬性名 = Key全限定類名
Key_productMap=java.lang.String
# Map Value 類型:Element_屬性名 = Value全限定類名
Element_productMap=com.example.domain.Product
| 集合類型 | 鍵前綴 | 格式 | 示例 |
|---|---|---|---|
| List / Set | Element_ | Element_屬性名=元素類全限定名 | Element_users=com.User |
| Map (Key) | Key_ | Key_屬性名=Key類全限定名 | Key_productMap=java.lang.Integer |
| Map (Value) | Element_ | Element_屬性名=Value類全限定名 | Element_productMap=com.Product |
| 數組 | Element_ | Element_屬性名=元素類全限定名 | Element_ids=java.lang.Long |
若多個 Action 共用同類型集合,可在 src 根目錄創建 xwork-conversion.properties 定義全局規則:
# 全局:所有名為 users 的 List 皆為 User 元素
Element_users=com.example.domain.User
# 全局:所有名為 productMap 的 Map 皆為 String->Product
Key_productMap=java.lang.String
Element_productMap=com.example.domain.Product
CollectionConverter / MapConverter*-conversion.properties 獲取元素類型UserConverter)LoginAction-conversion.properties 必須與類名完全一致src/main/resources/com/example/action/private List<User> users; Struts 2.5+ 支持泛型反射獲取,無需配置文件List<Map<String, List<Product>>> 建議拆分為獨立 DTO 類,避免配置地獄Struts 2 已淘汰,現代框架(Spring MVC、Spring Boot)通過泛型反射直接獲取集合元素類型,無需額外配置:
@PostMapping("/users")
public Result<List<User>> batchCreate(@RequestBody List<User> users) {
// 直接獲得 List,Jackson 自動反序列化每個元素
return Result.success(userService.batchSave(users));
}
總結:Struts 2 因泛型擦除無法感知集合元素類型,通過
ActionName-conversion.properties指定Element_屬性名(List/Set/數組)或Key_屬性名/Element_屬性名(Map)。現代開發請直接使用 Spring MVC + Jackson,框架自動處理泛型類型轉換。