2016-11-08 8 views
0

私たちは既存のホテル管理システムを持っています。システムの "Create Accommodation"機能で日付検証を追加するように求められました。ダイアログには、次のようになります。以下のコードに示すようHibernateでの日付の検証

enter image description here

「終了日」がすでに検証されます。 Hibernate内の@Futureアノテーションは、日付が将来のものであることを保証します。

@NotNull 
@Future 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Temporal(TemporalType.DATE) 
private Date endDate; 

私は、 "開始日" に検証を追加するように頼まれたEDIT

。現在または将来の日付のみが許可されます。 @Presentアノテーションを使用しようとしましたが、そのようなことはないと思います。残念ながら、@Futureは今日の日付を受け付けていません。私はこの種のことに新しいです。だから私は誰かが私を助けることを願っていますありがとうございました。

+0

注釈 '@ Future'はどのクラス/フレームワークから来ていますか? – Axel

+0

それは私が考えている休眠です –

+1

現在の日付が唯一の有効な値であれば、なぜフィールドを持っているのでしょうか? –

答えて

2

を休止を使用でき

@CreationTimestamp 
@Temporal(TemporalType.DATE) 
@Column(name = "create_date") 
private Date startDate; 

または更新

@UpdateTimestamp 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modify_date") 
private Date startDate; 

のJava(JPA)

にあなたはフィールドDate startDate;を定義し、

@PrePersist 
protected void onCreateStartDate() { 
startDate = new Date(); 

または更新に

@PreUpdate 
protected void onUpdateStartDate() { 
startDate = new Date(); 

UPDAを使用することができます例と例

開始日を現在に固定しないように質問を更新した後、別の方法を実行する必要があります。 hereのように、日付が現在のものか将来のものかをチェックするカスタムバリデーターを作成する必要があります。

は、したがって、あなたはPresentOrFuture.javaに新しい注釈を導入することができます:

public class PresentOrFutureValidator 
    implements ConstraintValidator<PresentOrFuture, Date> { 

    public final void initialize(final PresentOrFuture annotation) {} 

    public final boolean isValid(final Date value, 
     final ConstraintValidatorContext context) { 

     // Only use the date for comparison 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 

     Date today = calendar.getTime(); 

     // Your date must be after today or today (== not before today) 
     return !value.before(today) || value.after(today); 

    } 
} 

が次にあなたが設定する必要があります:

@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = PresentOrFutureValidator.class) 
@Documented 
public @interface PresentOrFuture { 
    String message() default "{PresentOrFuture.message}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

が次にあなたがPresentOrFutureValidator.javaでバリデータを定義する必要があり

@NotNull 
@PresentOrFuture 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Temporal(TemporalType.DATE) 
private Date startDate; 

まあ、それはexhausiveだった。私は自分自身でそれをテストしていない、私は今そうする準備がないので、それは動作するはずです。私はそれが助けて欲しい今

+0

遅れてご返事申し訳ありません。これはstartDateのコードです:http://pastie.org/10958151私はあなたが私を導くことができれば幸いです。ありがとうございました。 –

+0

現在のタイムスタンプのみを許可できる場合、なぜセッターメソッドがありますか? HibernateまたはJPAを使用していますか? – thatguy

+0

申し訳ありませんが、私は自分の質問を編集しました。現在および将来の日付を受け入れる必要があります。私は休止状態を使用します。 –

0

最も簡単な方法は、このフィールドを無効(編集不可)にして現在の日付を入力することではありません。したがって、検証は必要ありません。あなたは、このアプローチが気に入らない場合

を参照してください。このURL
Annotation for hibernate validator for a date at least 24 hours in the future

の代わりに24時間チェックインをご自身の注釈を作成するには、日付の値が現在の日付と等しいかどうかを確認する必要があり

+0

これは回避策です。解決策/答えではありません。 – Rehman

0
public class PresentOrFutureValidator implements 
     ConstraintValidator<PresentOrFuture, Date> { 

    public final void initialize(final PresentOrFuture annotation) { 
    } 

    public final boolean isValid(final Date value, 
     final ConstraintValidatorContext context) { 



     // Only use the date for comparison 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 

     Date today = calendar.getTime(); 
      value.setHours(0); 
    value.setMinutes(0); 
    value.setSeconds(0); 



     // Your date`enter code here` must be after today or today (== not before today) 
     return !value.before(today) || value.after(today)|| value.toString().equals(today.toString()); 

    } 
} 
1

<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>2.0.0.Final</version> 
</dependency> 

経由で更新され、新しいバリデータのバージョン、すなわち

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>6.0.4.Final</version> 
</dependency> 

に私たちは@FutureOrPresent、あなたが使用することができ、他の多くの有用な注釈を持っています。