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」の 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、対応する入力フィールドが空のままの場合にスローします。

4

1 に答える 1

1

取得する例外 ( MissingServletRequestParameterException) は、実際にはパラメーターが必要であるが存在しない場合にのみスローされます。パラメータは空にすることもできます。

さらに、バインドはパラメーター チェックの後に行われます。つまり、カスタム エディターが呼び出される前に例外が発生します。

問題は別の方法に関連している必要があります。たぶん、メソッドでリダイレクトしますfilter

于 2013-07-05T14:47:44.657 に答える