web-dev-qa-db-ja.com

Spring MVCコントローラーへのGETリクエストで日付パラメーターを受け入れる方法は?

日付をYYYY-MM-DD形式でSpring Controllerに送信するGETリクエストがあります。コントローラコードは次のとおりです。

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
        //Content goes here
    }

Firebugでチェックしているときに、リクエストは正しく送信されます。エラーが表示されます:

HTTPステータス400:クライアントから送信されたリクエストは構文的に正しくありません。

コントローラーがこの形式の日付を受け入れるようにするにはどうすればよいですか?助けてください。私は何を間違えていますか?

111
LittleLebowski

わかった、解決した。 1日のノンストップコーディングで疲れて、そのような愚かなことを見逃してしまうかもしれない人のためにそれを書いてください。

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
        //Content goes here
    }

はい、それは簡単です。 DateTimeFormatアノテーションを追加するだけです。

228
LittleLebowski

...または、正しい方法でそれを行い、アプリケーション全体で日付のシリアル化/非シリアル化の一貫したルールを設定できます。これをapplication.propertiesに配置します。

spring.mvc.date-format=yyyy-MM-dd
5
Paul T

これは私がフロントエンドからフォーマットされた日付を取得するためにしたことです

  @RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
  @ResponseBody
  public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
   return OK;
  }

これを使用して、必要なものを取得できます。

5
AbdusSalam

PathVariableを使用する場合は、以下のメソッド例を使用できます(すべてのメソッドは同じであり、同じことを行います)。

//You can consume the path .../users/added-since1/2019-04-25
@GetMapping("/users/added-since1/{since}")
public String userAddedSince1(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}

//You can consume the path .../users/added-since2/2019-04-25
@RequestMapping("/users/added-since2/{since}")
public String userAddedSince2(@PathVariable("since") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date since) {
    return "Date: " + since.toString(); //The output is "Date: Wed Apr 24 19:00:00 COT 2019"
}

//You can consume the path .../users/added-since3/2019-04-25
@RequestMapping("/users/added-since3/{since}")
public String userAddedSince3(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}
0
David Jesus