2015-11-29 79 views
1

我有一個帶有2個複選框和一個提交按鈕的簡單表單。當我提交表單時,出現此錯誤Spring MVC複選框HTTP狀態400客戶端發送的請求在語法上是不正確的

HTTP狀態400客戶端發送的請求在語法上不正確。

這是我的POJO:

public class Menu{ 
    private String day; 
    private String name; 
    private int price; 

    public Menu(){ 
    } 

    public Menu(String day, String name, int price) { 
     this.day = day; 
     this.name = name; 
     this.price = price; 
    } 

    public int getPrice() { 
     return price; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDay() { 
     return day; 
    } 

    public void setDay(String l) { 
     this.day = l; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 7 * hash + this.day.hashCode(); 
     hash = 7 * hash + this.name.hashCode(); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     boolean result = false; 
     System.out.println("ARE YOU EVER CALLLED HOW MANY TIMES"); 
     if (object == null || object.getClass() != getClass()) { 
      result = false; 
     } else { 
      Menu sc = (Menu) object; 
      if (this.day == sc.getDay() && this.name == sc.getName() 
       && this.price == sc.getPrice()) { 
       result = true; 
      } 
     } 
     return result; 
    } 

這是我的Order類:

public class Order { 
    private List<Menu> menus = new ArrayList<Menu>(); 
    public Order(){} 

    public Order(ArrayList<Menu> menus){ 
     this.menus = menus;   
    } 

    public List<Menu> getMenus() { 
     return menus; 
    } 

    public void setMenus(ArrayList<Menu> menus) { 
     this.menus = menus; 
    } 

} 

這是我的控制器:

@Controller 
public class RestaurantController { 
    @RequestMapping(value = "/menu", method = RequestMethod.GET) 
    public String menuPage(Model model){    
     Order o = new Order(); 
     ArrayList<Menu> m = new ArrayList<Menu>(); 
     m.add(new Menu("Sunday", "Phir Aloo", 12)); 
     m.add(new Menu("Sunday", "Phir Cholay", 9)); 
     model.addAttribute("today", m); 
     model.addAttribute("order", o); 
     return "/menu"; 
    } 

    @RequestMapping(value = "/confirm", method = RequestMethod.POST) 
    public String done(@ModelAttribute(value="order") Order order, Model model){    
     return "/confirm"; 
    } 

這是我的菜單。 jsp:(http://localhost:9080/res/menu

<form:form modelAttribute="order" method="post" action="/res/confirm"> 
    <c:forEach items="${today}" var="r"> 
     <form:checkbox path="menus" value="${r}" label="${r.name } ${r.price }" /> 
    </c:forEach> 
    <input type="submit" value="Submit Data"> 

</form:form> 

現在我只希望Class Order的屬性'menus'被選中的複選框填充。相反,我得到這個錯誤「由客戶端發送的請求是語法不正確的。我已經看過了這個網站上的每一個可能的答案,但似乎沒有任何要解決的問題。


後@R張以芳的建議我能。要解決的問題這裏是我的屬性編輯器

public class MenuTypeEditor extends PropertyEditorSupport { 
    public void setAsText(String text) { 
     setValue(new Menu(text.toUpperCase())); 
    } 
} 

我保持了具有Menu.java和Order.java

現在在我的控制器寫這同一個包裏面這個類:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Menu.class, new MenuTypeEditor()); 
} 

瞧!魔術發生了。

我希望這個答案可以幫助別人。

+0

什麼是您的應用程序URL? – hagrawal

+0

@hagrawal http:// localhost:9080/res/menu –

回答

1

問題出在您勾選複選框時發佈的值。請看下面的代碼

<form:checkbox path="menus" **value="${r}"** label="${r.name } ${r.price }" /> 

查看在上面的行中賦予value屬性的內容。它的整個菜單對象。它基本上會發布對象的toString()表示。由於您尚未爲Menu類實現toString(),因此類似於Menu @ 1ed2e55e的內容會針對複選框值發佈。 Spring無法將其轉換爲有意義的東西,因此也是問題所在。

您必須利用屬性編輯器支持來處理這些類型的情況。屬性編輯器將幫助您將字符串轉換爲對象,反之亦然。在你的情況下,字符串到菜單對象,反之亦然。看看財產編輯的例子。希望這可以幫助

編輯: - 谷歌搜索了這個result。看看它,可能會幫助你理解。

+0

@R Sawant我正在使用它將在實現PropertyEditor後更新 –

+0

感謝@R Sawant它的工作。我在我的問題中張貼我的財產編輯器。在那裏,我遇到了一個非常小的問題,我可以找到解決辦法。如果你可以看看它,並告訴我如何解決它,我會感激你。否則,你以前的建議就夠了。 –

相關問題