2013-07-05 4 views
1

Я пишу веб-приложение с использованием Spring MVC. В моей jsp есть форма, содержимое которой отправляется с Ajax на мой контроллер. Упрощенный код для преобразованного метода выглядит:Spring MVC: Требуемый параметр даты 'date' нет

@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) Дата 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; 
} 

Даты и обертки объектов throw MissingServletRequestParameterException w и их соответствующие поля ввода остаются пустыми.

+0

Какова информация о переменной DATA в вашем сообщении ajax? – renanlf

+0

Я пробовал две отправные данные в двух типах: a) 'var data = $ ('# form'). Serialize()', а затем он выглядел примерно так: param1 = & param2 = & param3 = ' b) чтение каждого ввод separetly и создание объекта данных: 'var param1 = $ ('# param1) .val(); var param2 = $ ('# param2) .val(); var data = { param1: param1, param2: param2 } ' – Nav

ответ

1

Исключение, которое вы получаете (MissingServletRequestParameterException), действительно бросается только при необходимости параметра, но не присутствует. Параметр может быть пустым.

Кроме того связывание происходит после проверка параметров. Это означает, что когда вы получаете исключение, это до вызывается пользовательский редактор.

Проблема должна быть связана с другим методом. Возможно, вы перенаправите метод filter.

+0

Во время отладки я заметил, что исключение вызывается после строки' setValue (null) ', поэтому кажется, что ставка была до проверки. Более того, это не перенаправление в методе. – Nav

+0

Установите точку останова для 'MissingServletRequestParameterException', тогда вы знаете, когда это произойдет :) О, какую версию Spring вы используете? То, что я написал, действительно может быть ошибочным для более ранних версий. – zeroflagL

+0

Я использую Spring 3.2.3. Так почему я могу перейти в метод привязки до исключения? – Nav

Смежные вопросы