我正在使用 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
在其相应的输入字段留空时抛出。