2017-06-13 8 views
0

私はJavaの初心者です。私は日付を取得するためDateクラスを使用していた、要求にSpring Bootでリクエストの3桁の時間を拒否する方法は?

{ 
    "appointmentDate":"2017-05-30", 
    "appointmentTime":"23:30:00" 
} 

を、JSONで次の形式で日付と時刻を取得

、私はこれをやっていた上記のリクエストクラスで

@NotNull(message = "appointmentDate is required") 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") 
    private Date appointmentDate; 

    @NotNull(message = "appointmentTime is required") 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss") 
    private String appointmentTime; 

ました時間をStringと見なします。

サービスクラスでは、文字列オブジェクトを日付オブジェクトに変換しようとしています。次に、テーブルを検索して、テーブル内の予定リストを検索しようとしています。

// convert into string 
    String dateString = null; 
    SimpleDateFormat sdfr = new SimpleDateFormat("yyyy-MM-dd"); 
    dateString = sdfr.format(appointmentDate); 
    String dt = dateString + " " + appointmenTime; 
    Date startDateAndTime = null; 
    try { 
     //startDateAndTime = yyyyMMddFormat.parse(yyyyMMddFormat.format(dt)); 
     startDateAndTime = new SimpleDateFormat(Constants.DATEANDTIME).parse(dt); 
    } catch (ParseException e) { 
     throw new IllegalArgumentException("Illegal date format"); 
    } 

しかし、私が直面している問題は、間違った日付を入力しても出力が得られることです。日付のエラーで解析例外がスローされません。

{ 
     "appointmentDate":"20171-05-30", 
     "appointmentTime":"231:30:00" 
    } 

私はあなたがあなたの日付と時間のために近代的なクラスLocalDateLocalTimeを使用することをお勧めすることを許可し、これは私の定数

public static final String DATEANDTIME = "yyyy-MM-dd HH:mm:ss"; 

であり、これは私のリポジトリのクエリで、

@Query(value = "select COUNT(a.doctorId) from Appointment a WHERE a.doctorId = :doctorId AND a.scheduleFromTime = :appointmentDateTime") 
    Long findAppointmentExists(@Param("doctorId") Long doctorId, 
      @Param("appointmentDateTime") Date appointmentDateTime); 
+0

SimpleDateFormatは非常に堅牢で、何かを処理します。それは有効な日付ではありませんか? –

+0

何の定数?日付と時間の値ですか? – Jerry06

+0

補足として、SimpleDateFormatは日付と時刻を扱うことができるので、2つの文字列を一緒に追加してから、yyyy-MM-dd HH:mm:ssを使用して –

答えて

2

。そして、それはたとえば

if (appointmentDate.isAfter(LocalDate.now().plusYears(5)) { 
    throw new IllegalArgumentException("Too far into the future"); 
} 

これは、年の値の5桁の年と他の多くのエラーをキャッチしますのために行うために簡単です。適切な制限を自分で設定してください。同様に過去の日付を禁止することもできますが、厳格な制限を設けることもできます。 LocalTimeは23:59:59.999999999までの時間しか受け付けていないため、これは内蔵されています。

が、私は私の頭の上からコードスニペットを入力した

LocalDateTime startDateAndTime = LocalDateTime.of(appointmentDate, appointmentTime); 

1つのオブジェクトに両方を結合するには、タイプミスや2がある可能性があります。修正できない場合は元に戻してください。

私はSpring Bootに関する最近の経験はありません。この質問には、Spring BootとJacksonとの現代のJava日時クラスの使用に関する詳細があります:JSON Java 8 LocalDateTime format in Spring Boot。そして、他の場所ではまだ疑いがない。

+0

です。つまり、DateオブジェクトをEntityのDateTimeオブジェクトに変更する必要があります。それは私が上記のようにするとき、私はこのエラーを取得する "パラメータ値[2017-05-30T23:30]は期待される型[java.util.Date(n/a)]と一致しなかった;入れ子になった例外はjava.lang .IllegalArgumentException:パラメータ値[2017-05-30T23:30]が予想されるタイプと一致しませんでした[java.util.Date(n/a)] " –

+0

私はSpring-Bootに関する知識が豊富な人がここに入ることを望んでいました。あなたの新しいエラーメッセージにはさまざまな解決策があると思います。私の一般的な推薦は、あなたが非常に良い理由がない限り、oldfashionedの 'Date'クラスを完全に避けることです。現代のクラスはかなりプログラマに優しいです。 –

0

コードの最初の日付形式は意味がありません。日付に変換するだけです(試みたときに失敗していました)。

私はあなたの例から不要な行を取り出し、以下の「働く」例を掲載しました。

 String dt = appointmentDate + " " + appointmentTime; 
     Date startDateAndTime = null; 

     try 
     { 
      startDateAndTime = new SimpleDateFormat(Constants.DATEANDTIME).parse(dt); 
     } catch (ParseException e) 
     { 
      throw new IllegalArgumentException("Illegal date format"); 
     } 
     System.out.println(startDateAndTime); 

これは、何かが動作していないときに多く発生する傾向があり、完全に停止するまでコードを投げつけます。時々戻って、実際に何を達成しようとしているのかを試してから、もう一度それに挑戦するのは良いことです。

関連する問題