spring mvc 表单参数传递问题

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注
  • Spring

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

    942 引用 • 1459 回帖 • 31 关注
  • 参数
    6 引用 • 45 回帖

相关帖子

欢迎来到这里!

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

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