spring mvc 表单参数传递问题

本贴最后更新于 2662 天前,其中的信息可能已经事过境迁

springmvc 表单提交 controler 层需要接收 list 对象参数 ,但是昨天在家里弄怎么试都不成功,有人知道怎么搞吗?

页面代码

<form action="swingAdd.html" method="post">
<hr/>
<p>id:<input type="text" name="list[0].id"/>, 

root: <select name="list[0].root"><option value="false">false<option><option value="true" selected="selected">true<option><select>, 
expression:<input type="text" name="list[0].expression"/>, 
validate_type:<select name="list[0].validateType"><option value="buyPrice">buyPriceo<ption><select>,
expect:<input type="text" name="list[0].expect"/>, 
or_else:<input type="text" name="list[0].orElse"/>, 
child_id:<input type="text" name="list[0].child"/>。 <input type="button" onclick="addChild(this);" value="增加子节点"/>

<p>
<input type="submit" value="提交"/>
<form>

controller 代码

@RequestMapping(value = "/swingAdd", method = RequestMethod.POST)
    public String swingAdd(SwingFormList formList, Model model) {
//        System.out.println(swingList);
  return "swing/swingRule";
    }

SwingFormList 源码

public class SwingFormList {
    private List<Swing> list;

    public List<Swing> getList() {
        return list;
    }

    public void setList(List<Swing> list) {
        this.list = list;
    }
}

Swing 源码

public class Swing {

    //REQUIRED
  private String id;
    private String expression;
    private Validater validateType;
    private String expect;
    //IMPLIED
  private boolean autoTrigger;
    private String orElse;
    private String executor;
    private Swing child;
    //other
  private boolean root;
 }

没拷贝 get/set 方法了

页面错误信息

There was an unexpected error (type=Bad Request, status=400).

Validation failed for object='swingFormList'. Error count: 1

补充出错原因

child name 为 child_id:<input type="text" name="list[0].child"/>, 而 Swing.class.isAssignableFrom(org.eddy.swing.entity.Swing#child.getClass())
spring 会尝试获取参数为一个字符串类型的构造函数并 newInstance

org.springframework.beans.TypeConverterDelegate#convertIfNecessary(java.lang.String, java.lang.Object, java.lang.Object, java.lang.Class, org.springframework.core.convert.TypeDescriptor)

else if (convertedValue instanceof String && !requiredType.isInstance(convertedValue)) {
   if (conversionAttemptEx == null && !requiredType.isInterface() && !requiredType.isEnum()) {
      try {
         Constructor<T> strCtor = requiredType.getConstructor(String.class);
         return BeanUtils.instantiateClass(strCtor, convertedValue);
      }
      catch (NoSuchMethodException ex) {
         // proceed with field lookup
  if (logger.isTraceEnabled()) {
            logger.trace("No String constructor found on type [" + requiredType.getName() + "]", ex);
         }
      }
      catch (Exception ex) {
         if (logger.isDebugEnabled()) {
            logger.debug("Construction via String failed for type [" + requiredType.getName() + "]", ex);
         }
      }
   }

由于我没有参数为一个 String 对象的构造函数,导致产生了异常。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注
  • 参数
    6 引用 • 45 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 714593351

    上代码上代码

  • fengbujue

    if(list[0]!=null && list[0].username !=null){
    var username=list[0].username ;
    }

  • 61260551

    上传 jsp 代码

  • meikaiyipian

    可以将 list 绑定到对象中,我的 Form 表单大表格增删改就是一起提交的

    1 回复
  • eddy
    作者

    我是这么做的, 但是报异常了

    1 回复
  • meikaiyipian

    什么都不要说了,上代码

    1 回复
  • mitewater

    我觉得题主需要描述清楚,或者上代码
    1、请求方式是什么,请求体中写入数据的还是以 URL
    2、有没有在 spring 中设置拦截,设置拦截有没有进行 JSON 转换
    3、uri 路径,与配置注解的路径是否一致。

  • eddy
    作者

    代码已上

  • eddy
    作者

    已解决:

    错误原因

    child 为 swing 对象,而表单属性确是 child_id:<input type="text" name="list[0].child"/>
    无法和 Swing.child 对象映射上

请输入回帖内容 ...