SpringMVC - 使用通用支持将对象列表作为参数发送时出错

Eri*_*ang 6 java generics spring spring-mvc

我想将模型数据列表发送到springMVC.

基本思路是:

  • 创建包装器Java POJO以包含目标POJO列表作为字段.
  • 然后@ModelAttribute用来获取请求参数.

A.以下代码运作良好:

HTML代码:( 单个模型)

<tr>
    <td>id:</td>
    <td><input type="text" id="sportsFieldList[0].id" name="sportsFieldList[0].id" /></td>
</tr>
<tr>
    <td>name:</td>
    <td><input type="text" id="sportsFieldList[0].name" name="sportsFieldList[0].name" /></td>
</tr>
<tr>
    <td>location:</td>
    <td><input type="text" id="sportsFieldList[0].location" name="sportsFieldList[0].location" /></td>
</tr>
<tr>
    <td>description:</td>
    <td><input type="text" id="sportsFieldList[0].description" name="sportsFieldList[0].description" /></td>
</tr>
Run Code Online (Sandbox Code Playgroud)

SportsFieldListWrapper.java:

import java.util.List;

import xxx.SportsField;

public class SportsFieldListWrapper {
    private List<SportsField> sportsFieldList;

    public List<SportsField> getSportsFieldList() {
        return sportsFieldList;
    }

    public void setSportsFieldList(List<SportsField> sportsFieldList) {
        this.sportsFieldList = sportsFieldList;
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

public @ResponseBody Map<Object, Object> batchAdd(@ModelAttribute SportsFieldListWrapper sflWrapper) {
}
Run Code Online (Sandbox Code Playgroud)

SportsField.java:

// Just a simple POJO
public class SportsField {
    private Long id;
    // more fields

    // getter & setter
}
Run Code Online (Sandbox Code Playgroud)

B.当我试图使它成为通用时,它停止工作.

我尝试创建一个可重用的通用版本的包装器,以避免为每种类型创建一个包装器.

ListParamWrapper.java:

import java.util.List;

public class ListParamWrapper<T> {
    private List<T> paramList;

    public List<T> getParamList() {
        return paramList;
    }

    public void setParamList(List<T> paramList) {
        this.paramList = paramList;
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

public @ResponseBody Map<Object, Object> batchAdd(@ModelAttribute ListParamWrapper<SportsField> listWrapper) {
}
Run Code Online (Sandbox Code Playgroud)

HTML代码:( 单个模型)

<tr>
    <td>id:</td>
    <td><input type="text" id="paramList[0].id" name="paramList[0].id" /></td>
</tr>
<tr>
    <td>name:</td>
    <td><input type="text" id="paramList[0].name" name="paramList[0].name" /></td>
</tr>
<tr>
    <td>location:</td>
    <td><input type="text" id="paramList[0].location" name="paramList[0].location" /></td>
</tr>
<tr>
    <td>description:</td>
    <td><input type="text" id="paramList[0].description" name="paramList[0].description" /></td>
</tr>
Run Code Online (Sandbox Code Playgroud)

得到错误:

org.springframework.beans.InvalidPropertyException:bean类的无效属性'paramList [0]'[com.sportslight.entity.ListParamWrap per]:属性路径'paramList [0]'中的越界索引; 嵌套异常是java.lang.IndexOutOfBoundsException:索引:0,大小:0

我已经在Google上搜索过,当列表大小> 256时,可能会出现类似的错误,但事实并非如此,测试中的列表大小只有2.


问题:

  • 是什么原因造成的?是由于泛型类型?在这种情况下,Spring无法正确创建对象?
  • 如何避免为每种类型创建包装类?

Fra*_*ard 0

该错误消息意味着 paramList 为空,即使您认为它的大小是 2。

您没有显示实例化包装器的代码,因此我无法提示为什么它是空的。