2016-09-13 4 views
-1

Я воспользовался таким количеством примеров такого рода и предлагаемыми решениями с этого сайта, но ни одно из решений, представленных на нем, не относится к моей проблеме. Я считаю, что это сообщение об ошибке, 400, появляется, когда информация, посланная контроллеру, выполняется. Я провел последние два дня, перекрестные ссылки на другой проект, над которым я работал в прошлом, который работает, но я не могу решить проблему.400 запрос, отправленный клиентом, был синтаксически неправильным

@RequestMapping(value = {"/", "/home"}, method = RequestMethod.GET) 
    public String homePage(ModelMap model) { 
     model.addAttribute("user", getPrincipal()); 
    Catalog catalog = catalogService.getCatalogByCategory(Catalog.CatalogCategory.ALL); 

    model.addAttribute("catalog", catalog); 
    return "welcome"; 
} 

Это посылает данные в JSTL Spring форму на моем JSP следующим образом:

<form:form method="POST" modelAttribute="catalog"> 
     <form:hidden path="id"/> 
     <form:hidden path="name"/> 
     <form:hidden path="category"/> 
     <form:hidden path="orderItems"/> 


     <div id="products" class="row list-group"> 
      <c:forEach var="orderItem" items="${catalog.orderItems}"> 

       <div class="item col-xs-4 col-lg-4"> 
        <div class="thumbnail"> 
         <img class="group list-group-image" src="http://placehold.it/400x250/000/fff" alt=""/> 

         <div class="caption"> 
          <h4 class="group inner list-group-item-heading"> 
            ${orderItem.name}</h4> 

          <p class="group inner list-group-item-text"> 
            ${orderItem.description} 
          </p> 

          <div class="row"> 
           <div class="col-xs-12 col-md-6"> 
            <p class="lead"> 
             R ${orderItem.price}</p> 
           </div> 
           <div class="col-xs-12 col-md-6"> 
            <label for="${orderItem.id}" class="btn btn-primary">Add to Cart <input 
              type="checkbox" id="${orderItem.id}" name="orderItem.addedToCart" 
              class="badgebox"><span class="badge">&check;</span></label> 
           </div> 
          </div> 
         </div> 
        </div> 
       </div> 
      </c:forEach> 
     </div> 

     <div class="row"> 
      <div class="form-group"> 
       <div class="col-sm-12 pull-right"> 
       </div> 
       <div class="col-sm-2 pull-right"> 

        <input type="submit" 
          class="btn btn-default btn-block btn-primary" 
          value="Next" name="action" formmethod="POST" 
          formaction="confirmList"/> 

       </div> 
      </div> 
     </div> 
    </form:form>` 

В этот момент я отправить форму следующего слушателя в моем контроллере:

@RequestMapping(value = "/confirmList", method = RequestMethod.POST) 
public String confirmList(@ModelAttribute Catalog catalog, @ModelAttribute  String numberOfItemsAdded) { 

    List<OrderItem> selectedItems = new ArrayList<OrderItem>(); 
    for (OrderItem orderItem : catalog.getOrderItems()) { 
     if (orderItem.isAddedToCart()) { 
      selectedItems.add(orderItem); 
     } 
    } 
    //model.addAttribute("numberOfItemsAdded", selectedItems.size()); 
    return "welcome"; 
} 

Вот и все, поток выполнения даже не доходит до моего контроллера. Изнурительная ошибка, потому что я действительно не понимаю, что я делаю неправильно здесь. Спасибо заранее

EDIT:

Catalog.java

@Entity 
@Table(name="Catalogs") 
public class Catalog{ 

private long id; //generated value using hibernate ... 
private String name; //column annotated by @Column 
private String category;// column also annotated by @Column 
private List<OrderItem> orderItems;// one to many mapping 

    //getters and setters here 
} 
+0

сообщения вашего класса 'Catalog' и регулируйте на сторону сервера протоколирование отлаживать и посмотреть, что он говорит. – chrylis

+0

Спасибо за ваш быстрый ответ. Пожалуйста, см. Каталог.java, показанный выше –

ответ

1

Я проверил ваш код, и я получил HTTP 400 тоже. Дело в том, что браузер посылает не соответствует ти, что ожидает, что метод контроллера confirmList:

Это форма данных я видел в закладке сети Chrome:

id:1 
name:the catalog 
category:category 
orderItems:[[email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], com.eej.s[email protected], [email protected], [email protected]] 
orderItem.addedToCart:on 
orderItem.addedToCart:on 
orderItem.addedToCart:on 
orderItem.addedToCart:on 
action:Next 

Но контроллер не может понять это, как ТоварыЗаказ показывает toString() каждого экземпляра OrderItem, а добавленныйToCart не привязан к любому элементу orderItem списка orderItems.

Вы должны изменить ваш JSP следующим образом:

<form:form method="POST" modelAttribute="catalog"> 
     <form:hidden path="id"/> 
     <form:hidden path="name"/> 
     <form:hidden path="category"/> 
     <!-- form:hidden path="orderItems"/--> 


     <div id="products" class="row list-group"> 
      <c:forEach var="orderItem" items="${catalog.orderItems}" varStatus="status"> 

       <div class="item col-xs-4 col-lg-4"> 
        <div class="thumbnail"> 
         <img class="group list-group-image" src="http://placehold.it/400x250/000/fff" alt=""/> 

         <div class="caption"> 
          <h4 class="group inner list-group-item-heading"> 
            ${orderItem.name}</h4> 
            <form:hidden path="orderItems[${status.index}].name" /> 
          <p class="group inner list-group-item-text"> 
            ${orderItem.description} 
            <form:hidden path="orderItems[${status.index}].description" /> 
          </p> 

          <div class="row"> 
           <div class="col-xs-12 col-md-6"> 
            <p class="lead"> 
             R ${orderItem.price}</p> 
             <form:hidden path="orderItems[${status.index}].price" /> 
           </div> 
           <div class="col-xs-12 col-md-6"> 
            <label for="${orderItem.id}" class="btn btn-primary">Add to Cart <input 
              type="checkbox" id="${orderItem.id}" name="catalog.orderItems[${status.index}].addedToCart" 
              class="badgebox"><span class="badge">&check;</span></label> 
           </div> 
          </div> 
         </div> 
        </div> 
       </div> 
      </c:forEach> 
     </div> 

     <div class="row"> 
      <div class="form-group"> 
       <div class="col-sm-12 pull-right"> 
       </div> 
       <div class="col-sm-2 pull-right"> 

        <input type="submit" 
          class="btn btn-default btn-block btn-primary" 
          value="Next" name="action" formmethod="POST" 
          formaction="confirmList"/> 

       </div> 
      </div> 
     </div> 
    </form:form> 

Если вы сделаете это, вы могли видеть сообщение изменения в закладке сети в Chrome (или браузер, который вы используете). Это данные формы прямо сейчас:

id:1 
name:the catalog 
category:category 
orderItems[0].name:OrderItemName#0 
orderItems[0].description:OrderItemDesc#0 
orderItems[0].price:0.0 
orderItems[1].name:OrderItemName#1 
orderItems[1].description:OrderItemDesc#1 
orderItems[1].price:0.43645913001303904 
orderItems[2].name:OrderItemName#2 
orderItems[2].description:OrderItemDesc#2 
orderItems[2].price:1.7151992716801088 
orderItems[3].name:OrderItemName#3 
orderItems[3].description:OrderItemDesc#3 
orderItems[3].price:1.303683806806788 
orderItems[4].name:OrderItemName#4 
orderItems[4].description:OrderItemDesc#4 
orderItems[4].price:2.507039003743686 
orderItems[5].name:OrderItemName#5 
orderItems[5].description:OrderItemDesc#5 
orderItems[5].price:3.173744751378154 
orderItems[6].name:OrderItemName#6 
orderItems[6].description:OrderItemDesc#6 
orderItems[6].price:3.183771167856446 
catalog.orderItems[6].addedToCart:on 
orderItems[7].name:OrderItemName#7 
orderItems[7].description:OrderItemDesc#7 
orderItems[7].price:6.73370053587355 
catalog.orderItems[7].addedToCart:on 
orderItems[8].name:OrderItemName#8 
orderItems[8].description:OrderItemDesc#8 
orderItems[8].price:2.0266022634803216 
orderItems[9].name:OrderItemName#9 
orderItems[9].description:OrderItemDesc#9 
orderItems[9].price:5.251986962977732 
catalog.orderItems[9].addedToCart:on 
action:Next 

И вы увидите, теперь он возвращает HTTP 200 как запрос на самом деле достигает контроллера. Удалите @ModelAttribute в вашем методе контроллера тоже, как вы были предложены:

@RequestMapping(value = "/confirmList", method = RequestMethod.POST) 
    public String confirmList(Catalog catalog, String numberOfItemsAdded) { 

     List<OrderItem> selectedItems = new ArrayList<OrderItem>(); 
     for (OrderItem orderItem : catalog.getOrderItems()) { 
      if (orderItem.isAddedToCart()) { 
       selectedItems.add(orderItem); 
      } 
     } 
     //model.addAttribute("numberOfItemsAdded", selectedItems.size()); 
     return "catalog"; 
    } 
+0

Большое вам спасибо. Я внес коррективы, которые вы предложили, и они мне очень помогли. Это решение далека от того, что я мог подумать о себе. Это четкое решение и имеет смысл. Dankie! –

-1

попробовать эту дополнительную ручку в ваш контроллер и проверьте вашу консоль,

@ExceptionHandler(MissingServletRequestParameterException.class) 
public void handleMissingRequestParams(MissingServletRequestParameterException ex) { 
    System.out.println(); 
    System.out.println("------------------------MissingServletRequestParameterException------------------------"); 
    System.out.println(" Parameter name:- "+ex.getParameterName()); 
    System.out.println(" Parameter Type:- "+ex.getParameterType()); 
    System.out.println(" Cause:-    "+ex.getCause()); 
    System.out.println(" LocalizedMessage:- "+ex.getLocalizedMessage()); 
    System.out.println(" Message:-   "+ex.getMessage()); 
    System.out.println(" RootCause:-   "+ex.getRootCause()); 
    System.out.println("-------------------------------********************-----------------------------"); 
} 

Редактировать

@kholofelo Малома я могу «Т увидеть переменную numberOfItemsAdded в вашем JSP

И я никогда не использовал @ModelAttribute String numberOfItemsAdded для подстроки плз проверить это в документации, я думаю, что он используется вместе с Bean, плз подтверждают

скорее использовать @RequestParam

Read Documentation Here

Он очищает меня

Извините за ручку выше,

Обратите внимание, однако, что справочные данные и все другие контент модели недоступны для веб-представлений, когда обработка запросов приводит к исключению, поскольку исключение можно было бы повысить в любое время, делая недопустимым содержание модели. По этой причине методы @ExceptionHandler не предоставляют доступ к аргументу модели.