java.lang.IllegalStateException:在 ajax 调用中既不是 BindingResult 也不是普通目标对象
Posted
技术标签:
【中文标题】java.lang.IllegalStateException:在 ajax 调用中既不是 BindingResult 也不是普通目标对象【英文标题】:java.lang.IllegalStateException: Neither BindingResult nor plain target object in ajax call 【发布时间】: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>
提前谢谢你
【问题讨论】:
【参考方案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 和 $以上是关于java.lang.IllegalStateException:在 ajax 调用中既不是 BindingResult 也不是普通目标对象的主要内容,如果未能解决你的问题,请参考以下文章