Spring MVC Checkbox绑定问题

时间:2014-08-06 19:56:49

标签: java spring spring-mvc

问题:复选框值未正确绑定到我的表单。结果是我的所有布尔值都为空(至少是没有绑定的布尔值),并且现有的布尔值没有使用用户更改的值进行更新。

详细信息:我知道如果未选中复选框,则不会将复选框提交给服务器。但是,我确实在连接Eclipse调试器时看到了请求中的值。使用jQuery / Datatable填充数据,但使用表单提交将数据发回服务器。

Spring MVC版本:3.2.8 我假设它的配置,但我没有看到我错在哪里。这是我在控制器中所做的一小段代码片段。

@Controller
public class CheckboxController {
    ...
    @RequestMapping(value = "saveCheckboxes*", method = RequestMethod.POST)
    public String saveCheckboxes(@ModelAttribute(SESSION_FORM_KEY) CheckboxForm form, BindingResult result, ModelMap model) {

          // VALIDATE HERE...
          if ( !result.hasErrors() ) {
              // SAVE
          }
          else {
              // DON'T SAVE (alert user)
          }
    }
}

所以Spring MVC用于将请求输入绑定到我的表单。表单定义如下,其中包含一个带有布尔属性的摘要对象列表。

public class CheckboxForm {
    private List<Summary> summaries;
    ...
}

public class Summary {
   private boolean selected;
   ...
}

我使用jQuery / Datatables来填充我的在线数据网格。输入是使用数据表中的回调动态创建的。

var tableWidget = (function($) {

init = function() {
    ...
    "aoColumnDefs": [
         { "aTargets": [0], "sName": "", "mData": "selected" "stype": "html", "sClass": "center", "mRender": renderCheckbox, "bSortable":false, "sWidth": "50px" }
    ...
};

renderCheckbox = function(source, type, row) {
    var $name  = 'checkboxForm.summaries['+row.index+'].selected';
    return createCheckbox($name, source);
};

createCheckbox = function(name, checked) {
    var $checked = (checked === true) ? ' checked="checked"' : '';
    return '<input type="checkbox" name="'+name+'" value="true"'+$checked+'/><input type="hidden" name="_'+name+'" value="on"/>';
}
...
))(jQuery);

在完成所有这些之后,我连接了调试器并将其跟踪到WebDataBinder中。我发现它似乎在方法中抛出和异常:

public boolean isWritableProperty(String propertyName) 

说无法评估该属性。返回的每个属性都会发生这种情但是,我可以确认请求中的内容是我期望的输入。

1 个答案:

答案 0 :(得分:0)

首先,除非您知道为什么要在@RequestMapping方法中避免使用相对URL。这是错误的常见原因。

接下来,当您直接生成复选框而没有添加spring:checkbox的所有铃声和口哨声时,您将无法获得自动错误消息,并且如果取消选中最后一个复选框值,则可能会遇到问题,因为它们是未选中的将不会被浏览器传输,Spring将永远不会看到它们提供更短的列表(如果未选中,则甚至是空列表)。

话虽如此,您的问题是您使用checkboxForm.summaries[index].selected,而Spring只期望summaries[index].selected。移除checkboxForm,您的控制器应影响@ModelAttribute CheckboxForm form的值。