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


122

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:クライアントから送信されたリクエストは構文的に正しくありませんでした。

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

回答:


250

はい、解決しました。ノンストップのコーディングで丸一日疲れて、そのようなばかげたことを見逃している可能性がある人のためにそれを書いてください。

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

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


18
答えを書くつもりだったが、あなたは私を倒した。同じ形式である@DateTimeFormat(iso = ISO.DATE)を使用することもできます。ところで、できれば、Joda DateTimeライブラリを使用することをお勧めします。Springはそれを本当によくサポートしています。
Luciano

答えは一般的には大丈夫ですが、!Springのデフォルトとして構成する方法はありますか?@DateTimeFormat持っているすべてのコントローラーを配置するのは少しやり過ぎです...
thorinkor

3
@Lucianoはもちろん、@ DateTimeFormat(iso = ISO.DATE_TIME)も実行できます
kiedysktos

2
@thorinkor Spring Boot では、インターフェースを実装するBeanにspring.mvc.date-format属性を設定しapplication.propertiesたり、Beanを追加したりできorg.springframework.formatます(拡張org.springframework.format.datetime.DateFormatterがおそらく進むべき道です)。非Boot Spring @Overrideでは、そこにFormatter実装Bean のaddFormattersメソッドをWebMvcConfigurerAdapter追加できます。
UTF_or_Death 2017

10

これは、フロントエンドからフォーマットされた日付を取得するために行ったものです

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

あなたはそれをあなたが望むものを得るために使うことができます。


11
わかりませんでした。日付ではなく文字列としてdateStringを受け取った場合、@ PathTimeariに@ DateTimeFormatを追加する意味は何ですか?
イリヤサイクロン

7

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

spring.mvc.date-format=yyyy-MM-dd

3

以下のソリューションは、完全にスプリングブートアプリケーションで機能します。

コントローラ:

@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
    return userRepository.getAllInactiveUsers(dateTime);
}

したがって、呼び出し元(私の場合はWebフラックス)で、日付をこの("yyyy-MM-dd HH:mm:ss")形式で渡す必要があります。

発信者側:

public Flux<UserDto> getAllInactiveUsers(String dateTime) {
    Flux<UserDto> userDto = RegistryDBService.getDbWebClient(dbServiceUrl).get()
            .uri("/user/getAllInactiveUsers?date={dateTime}", dateTime).retrieve()
            .bodyToFlux(User.class).map(UserDto::of);
    return userDto;
}

リポジトリ:

@Query("SELECT u from User u  where u.validLoginDate < ?1 AND u.invalidLoginDate < ?1 and u.status!='LOCKED'")
List<User> getAllInactiveUsers(Date dateTime);

乾杯!!


2

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"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.