【问题标题】:java.lang.IllegalStateException: Neither BindingResult nor plain target object in ajax calljava.lang.IllegalStateException:在 ajax 调用中既不是 BindingResult 也不是普通目标对象
【发布时间】:2016-07-18 06:25:26
【问题描述】:

java.lang.IllegalStateException: ajax 调用中既不是 BindingResult 也不是普通目标对象

我正在使用 Thymeleaf 和 Spring MVC,但我在使用动态表单时遇到了一些问题。 我有一个带有选择器的表单,当它发生变化时,我进行了一个 Ajax 调用,它应该显示另一个选择器和一个字段。

我有这些物品:

 public class SaleMini{
    private int businessId;
    private int sellerId;
    private int productId;
    private int amount;
    private int row;
    private String date;
    private List<SaleItem> item;
   //getters and setters
}

public class SaleItem{
   private int productId;
   private int amount;
   private boolean gift;
   private List<Integer> components;
   private List<Composition> compositionList;   
  //getters and setters

}

我的html代码是:

<form id="sales" action="#" th:action="@{/sales/add}" method="post">                    
  <div class="row">
    <div class="form-group col-md-6">
        <label class="label-control" th:text="#{label.equipment}"></label>
        <select th:field="${sales.businessId}" class="form-control"   onchange="submitData()"> <!--- Equipment List --->
            <option th:each="e : ${equipmentList}" th:value="${e.id}" th:text="${e.name}"></option>
        </select>
    </div>

       <div class="form-group col-md-6">
         <label class="label-control" th:text="#{label.seller}"></label>
         <select th:field="${sales.sellerId}" class="form-control">
            <option th:each="s : ${sellerList}" th:value="${s.id}" th:text="${s.name + ' ' + s.surname}"></option>
        </select>
      </div>
  </div>

  <div id="product-panel" class="row" >
     <div th:fragment="resultsList">
        <div th:each="i,rowStat : ${itemList}">
            <p th:text="${i.productId}"></p>
                <select class="form-control products_select" th:field="${i.productId}" th:onchange="${'javascript:callComposed(' + rowStat.index  + ')'}" > 
                    <option value="0" >Select Product</option>
                    <option th:each="p : ${productList}" th:value="${p.id}" th:text="${p.name}" th:attr="data-compound=${p.compound},data-generic=${p.genericId}"></option>
                </select>
          </div>
          <a class="btn btn-action" id="btn-add"  onclick="submitData()" style="margin-top: 25px !important;"><span class="fa fa-plus fa-btn"></span></a> <!--I should add as many product as I wanted-->
    </div>                      
   </div>

   <div class="row">
      <div class="form-btn">
        <input type="submit" th:value="#{label.save.sale}" class="btn btn-custom"/>
      </div>
   </div>
</form>

当设备列表发生变化时,我会进行 ajax 调用

function submitData(){
 $.ajax({
    'url':  'sales/addRow',
    'type': 'POST',
    'data': $('#sales').serialize(),
    'success': function(result){
         $("#product-panel" ).html( result );
    },
 });
}

我在控制器上调用的函数是:

@RequestMapping(value = "/addRow", method = RequestMethod.POST)
public String addRow(@Valid SaleMini sale, BindingResult bindingResult,ModelMap model) {    

    List<SaleItem> siList = new ArrayList<SaleItem>();

    if(sale!=null && sale.getBusinessId()!=0)
    {
        SaleItem si = new SaleItem();
        si.setAmount(1);
        siList.add(si);

    }
    model.addAttribute("itemList", siList);
    return folder+"/add :: resultsList";
}   

问题是当我调用 submitData() 时。

我可以很好地调用控制器(submitData() 然后 addRow),它可以工作,但是当我得到数据时,我得到了错误:

java.lang.IllegalStateException: Bean 名称“i”的 BindingResult 和普通目标对象都不能用作请求属性 通话后我得到数据,但我无法使用 th:field 访问数据

在 html 部分这有效(th:text):

<p th:text="${i.productId}"></p>

但这不是(th:field),我不知道为什么:

<select class="form-control products_select" th:field="${i.productId}" th:onchange="${'javascript:callComposed(' + rowStat.index  + ')'}" > 
</select>

提前谢谢你

【问题讨论】:

    标签: java ajax spring-mvc thymeleaf


    【解决方案1】:

    您好,我认为您在表单中遗漏了一些细节。有了这个 th:object="sale" 你说什么是你的表单的模型属性,并且引用该对象的任何属性只需使用 *{attribute.path}强>

    <form id="sales" action="#" th:action="@{/sales/add}" method="post" th:object="sale">
    

    并且要引用您的销售对象的属性,请使用:

    <select th:field="*{businessId}" class="form-control"   onchange="submitData()"> <!--- Equipment List --->
            <option th:each="e : ${equipmentList}" th:value="${e.id}" th:text="${e.name}"></option>
        </select>
    

    【讨论】:

    • 谢谢,但我已经试过了,如果我使用 th:object 然后我使用 * 或不使用 th:object 和 $
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 2020-02-21
    • 2014-04-05
    • 2020-11-16
    • 2013-05-23
    • 1970-01-01
    • 2018-05-01
    • 2020-08-27
    相关资源
    最近更新 更多