SpringMVC - 使用泛型支持

时间:2016-09-22 16:11:21

标签: java spring spring-mvc generics

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

基本理念是:

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

甲。以下代码效果很好:

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>

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;
    }
}

控制器方法:

public @ResponseBody Map<Object, Object> batchAdd(@ModelAttribute SportsFieldListWrapper sflWrapper) {
}

SportsField.java:

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

    // getter & setter
}

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;
    }
}

控制器方法:

public @ResponseBody Map<Object, Object> batchAdd(@ModelAttribute ListParamWrapper<SportsField> listWrapper) {
}

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>

获取错误

  

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

我已在Google上搜索过此列表的大小&gt; 256,可能会得到类似的错误,但事实并非如此,测试中列表大小只有2。

问题:

  • 是什么导致了这个问题?是由于泛型类型?在这种情况下,Spring无法正确创建对象?
  • 如何避免为每种类型创建包装类?

1 个答案:

答案 0 :(得分:0)

错误消息表示paramList为空,即使您认为其大小为2。

你没有显示实例化Wrapper的代码,所以我不能给出一个提示为什么它是空的。