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」の null 値を許可しないのはなぜですか? なぜそうなのか、どうすればそれをキツネにできますか?
リクエストは次のように送信されます。
$.ajax({
type: 'POST',
url: '<c:url value="/admin/documents/filter"/>',
data: data
}).done(doneFunction);
コントローラーのコードは次のとおりです。
@Controller
@RequestMapping("/admin/documents") public class AdminDocumentsController extends 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
、対応する入力フィールドが空のままの場合にスローします。