Spring MVC:必需日期参数'date'不存在

时间:2013-07-05 13:35:04

标签: java spring-mvc

我正在使用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));
}

当表单输入中的String正确时,不会抛出异常。 问题是,当date的输入为空或包含无法转换为日期的String时,我会收到异常:Required Date parameter 'createdTo' is not present

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

为什么我的映射方法不允许`@RequestParam(required = false)Date createdTo'null value? 为什么会这样呢?我怎么能把它狐狸呢?

请求发送时间为:

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

控制器代码为:

@Controller

@RequestMapping( “/管理/文档”) 公共类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

1 个答案:

答案 0 :(得分:1)

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

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

问题必须与另一种方法有关。也许您使用filter方法重定向。