【问题标题】:Spring MVC checkboxes HTTP Status 400 The request sent by the client was syntactically incorrectSpring MVC 复选框 HTTP 状态 400 客户端发送的请求在语法上不正确
【发布时间】:2015-11-29 21:40:45
【问题描述】:

我有一个带有 2 个复选框和一个提交按钮的简单表单。当我提交表单时,我收到此错误

HTTP Status 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;
    }

这是我的订单类:

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";
    }

这是我的 menu.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 的属性“菜单”被选中的复选框填充。相反,我收到此错误“客户端发送的请求在语法上不正确。我已在此网站上查找了所有可能的答案,但似乎没有任何解决问题的方法。


在@R Sawant 的建议之后,我能够解决问题。这是我的属性编辑器。

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());
}

瞧!魔术发生了。

我希望这个答案可以帮助别人。

【问题讨论】:

标签: spring-mvc checkbox


【解决方案1】:

问题在于勾选复选框时您发布的值。看下面的代码

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

查看上一行中分配给 value 属性的内容。它的整个菜单对象。它本质上将发布对象的 toString() 表示。由于您尚未为 Menu 类实现 toString(),因此会为复选框值发布类似 Menu@1ed2e55e 的内容。 Spring 无法将其转换为有意义的东西,因此是问题所在。

您必须利用属性编辑器支持来处理这些类型的情况。属性编辑器将帮助您将字符串转换为对象,反之亦然。在您的情况下,字符串到菜单对象,反之亦然。查看属性编辑器的示例。希望这会有所帮助

编辑:- 谷歌搜索得到这个result。看看吧,或许能帮助你理解。

【讨论】:

  • @R Sawant 我正在研究它将在实施 PropertyEditor 后更新您
  • 感谢@R Sawant 成功了。我在我的问题中发布了我的属性编辑器。在那里我遇到了一个非常小的问题,我能够找到解决方法。不过,如果您能看一下它并告诉我如何解决它,我将不胜感激。否则,您之前的建议就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多