2015-11-29 50 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它的工作。我在我的问题中张贴我的财产编辑器。在那里,我遇到了一个非常小的问题,我可以找到解决办法。如果你可以看看它,并告诉我如何解决它,我会感激你。否则,你以前的建议就够了。 –

相关问题