1

我正在使用 Spring MVC 编写一个 Web 应用程序。在我的 jsp 中是一个表单,它的内容通过 Ajax 发送到我的控制器。映射方法的简化代码如下:

@RequestMapping(value = "/filter", method = RequestMethod.POST)
public String filter(@RequestParam(required=false) Date createdTo) { }

我已经注册了 CustomDateEditor:

@InitBinder
public void registerBinders(WebDataBinder binder){
    SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(format, true));
}

当表单输入中的字符串正确时,不会引发异常。问题是,当日期的输入为空或包含无法转换为日期的字符串时,我得到异常: Required Date parameter 'createdTo' is not present

我什至编写了自己的 DateEditor,在调试它的过程中,我注意到当编辑器将返回值设置为 null 时会出现问题setValue(null)。当我更改代码以使返回的值是当前日期时setValue(new Date()),即使对于空字符串,一切都有效。

为什么我的映射方法不允许有 `@RequestParam(required=false) Date createdTo' 空值?为什么会这样,我该如何解决?

请求通过以下方式发送:

$.ajax({
type: 'POST',
url: '<c:url value="/admin/documents/filter"/>',
data: data
}).done(doneFunction);

控制器代码为:

@Controller

@RequestMapping("/admin/documents") 公共类 AdminDocumentsController 扩展 BaseController {

@InitBinder
public void registerBinders(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new DateEditor());
}

@RequestMapping(value = { "", "/" }, method = RequestMethod.GET)
public String showDocuments(Model model) {
    model.addAttribute("so", new DocumentsSearchOptions());
    return "admin/documents";
}

@RequestMapping(value = "/filter", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> filter(@RequestParam String number,
        @RequestParam String invoiceNumber,
        @RequestParam String userSurname, @RequestParam(required=false) Double fromPrice,
        @RequestParam(required=false) Double toPrice, @RequestParam(required=false) Integer fromPoints,
        @RequestParam(required=false) Integer toPoints, @RequestParam String createdFrom,
        @RequestParam(required=false) Date createdTo, @RequestParam String invoiceFrom,
        @RequestParam String invoiceTo, @RequestParam String paidFrom,
        @RequestParam String paidTo) {

    Map<String, Object> model = new HashMap<>();

    return model;
}

日期和对象包装器MissingServletRequestParameterException在其相应的输入字段留空时抛出。

4

1 回答 1

1

您得到的异常 ( MissingServletRequestParameterException) 实际上仅在需要参数但不存在时才抛出。该参数甚至可以为空。

此外,绑定发生参数检查之后。这意味着当您得到异常时,它是在调用自定义编辑器之前。

该问题必须与另一种方法有关。也许你在filter方法中重定向。

于 2013-07-05T14:47:44.657 回答