2016-03-30 3 views
3

java.lang.IllegalStateException: Ни BindingResult, ни обычный целевой объект в Ajax вызоваjava.lang.IllegalStateException: Ни BindingResult, ни обычный целевой объект в Ajax вызова

Я использую 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: Ни BindingResult, ни простой целевой объект для bean name 'i', доступный как атрибут запроса Я получаю данные после вызова, но я не могу получить доступ к данным с помощью поля:

В html-части это работает (th: текст):

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

Но это не (th: f IELD), и я не знаю, почему:

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

Спасибо заранее

ответ

0

Привет Я думаю, вам не хватает пару деталей в вашей форме. С этой й: объект = «продажа» вы говорите, что будет modelAttribute вашей формы и сделать ссылку на любой атрибут этого объекта просто использовать * {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> 
+0

Спасибо, но я уже пробовал, и это то же самое, если я использую й: объект, а затем я использую * или без й: объект и $ – Zuri