質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アノテーション

アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2311閲覧

SpringBootアプリで自作アノテーションを機能させたい

asahiko123

総合スコア43

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アノテーション

アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/10/18 03:26

編集2021/10/18 04:13

前提・実現したいこと

SpringBootアプリで自作のアノテーションを作り、エラー発生時には
エラーメッセージを表示しようとしています。
@DayCheckというアノテーションを作り、これをFormクラスに付与する形です。

入力欄は以下のようなもので、エラーメッセージを表示したいのは次の場合です。

・作業日時の日付が開始時刻の日付と一致していない場合
→”作業日時と開始日時が違います”
・開始時刻の日付が終了時刻の日付より後である場合
→”終了日時は開始日時よりもあとの時刻を入力してください”

これらの条件を満たす場合に、入力をはじくと同時にエラーメッセージを表示するのがやりたいことです。
日付はCheckValidationクラスで具体的な処理を行っています。

イメージ説明

該当のソースコード

package com.example.demo.app.annotation; import java.time.LocalDate; import java.time.LocalDateTime; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import com.example.demo.app.dailyreport.DailyReportForm; public class DayCheckValidation implements ConstraintValidator<DayCheck,DailyReportForm>{ @Override public boolean isValid(DailyReportForm value,ConstraintValidatorContext context) { context.disableDefaultConstraintViolation(); return isValidCompare(value,context)&isValidEqual(value,context); } public boolean isValidCompare(DailyReportForm value,ConstraintValidatorContext context) { if(value.getStartTime()==null || value.getEndTime()==null) { return false; } context.buildConstraintViolationWithTemplate("終了日時は開始日時よりもあとの時刻を入力してください").addConstraintViolation(); return(LocalDateTime.parse(value.getStartTime())).isBefore(LocalDateTime.parse(value.getEndTime()))?true:false; } public boolean isValidEqual(DailyReportForm value,ConstraintValidatorContext context) { if(value.getCreated()==null || value.getStartTime()==null) { return false; } context.buildConstraintViolationWithTemplate("作業日時と開始日時が違います").addConstraintViolation(); LocalDateTime toLocaldate =LocalDateTime.parse(value.getStartTime()); LocalDate date =LocalDate.of(toLocaldate.getYear(), toLocaldate.getMonth(), toLocaldate.getDayOfMonth()); // System.out.println("created"+value.getCreated()); // System.out.println(LocalDate.parse(value.getCreated())==date ?true:false); return(LocalDate.parse(value.getCreated()))==date ?true:false; } }
package com.example.demo.app.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; @Constraint(validatedBy = DayCheckValidation.class) @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DayCheck { String message() default""; Class<?>[] groups() default{}; Class<? extends Payload>[] payload() default{}; }
package com.example.demo.app.dailyreport; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import com.example.demo.app.annotation.DayCheck; @DayCheck public class DailyReportForm { private int id; private int typeId; @NotNull(message ="内容を入力してください") private String created; @NotNull(message="内容を入力してください") private String startTime; @NotNull(message ="内容を入力してください") private String endTime; @NotNull(message ="内容を入力してください") @Size(max =20,min = 1) private String detail; private String diff; private String startDate; private String endDate; private String name; private int stuffId; private int workId; private String registeredId; private String workDivId; private boolean newReport; public DailyReportForm() { } public DailyReportForm( int id, @NotNull(message = "内容を入力してください") String created, @NotNull(message = "内容を入力してください") String startTime, @NotNull(message = "内容を入力してください") String endTime, @NotNull(message ="内容を入力してください")@Size(min = 1, max = 20)String detail, String startDate, String endDate, String diff, String name, boolean newReport, int stuffId, int workId, String registeredId, String workDivId) { this.id= id; this.created = created; this.endTime = endTime; this.startTime = startTime; this.startDate = startDate; this.diff = diff; this.endDate = endDate; this.detail = detail; this.stuffId = stuffId; this.registeredId = registeredId; this.workDivId = workDivId; this.workId = workId; this.name = name; this.newReport = newReport; } public String getDiff() { return diff; } public void setDiff(String diff) { this.diff = diff; } public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } public String getEndDate() { return endDate; } public void setEndDate(String endDate) { this.endDate = endDate; } public String getRegisteredId() { return registeredId; } public void setRegisteredId(String registeredId) { this.registeredId = registeredId; } public String getWorkDivId() { return workDivId; } public void setWorkDivId(String workDivId) { this.workDivId = workDivId; } public int getWorkId() { return workId; } public void setWorkId(int workId) { this.workId = workId; } public boolean isNewReport() { return newReport; } public void setNewReport(boolean newReport) { this.newReport = newReport; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getStuffId() { return stuffId; } public void setStuffId(int stuffId) { this.stuffId = stuffId; } public String getCreated() { return created; } public void setCreated(String created) { this.created = created; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTypeId() { return typeId; } public void setTypeId(int dailyReportId) { this.typeId = dailyReportId; } }
<form method ="POST" th:action ="${dailyReportForm.newReport}? @{/main/report/insert}:@{/main/report/update}" th:object="${dailyReportForm}"> <div class="form-group col-sm-5"> <p th:if="${dayCheck}" th:text="${dayCheck}" class ="alert alert-danger" role ="alert"></p> <label>作業日時</label> <input type ="date" class="form-control" name ="created" th:value ="*{created}"required> <label>開始時刻</label> <input type ="datetime-local"class="form-control" name ="startTime" th:value ="*{startTime}"required> <label>終了時刻</label> <input type ="datetime-local"class="form-control" name ="endTime" th:value ="*{endTime}"required> </div> <div class="d-grid gap-2 col-lg-2 py-5"> <input th:if ="${dailyReportId}" type ="hidden" th:value ="${dailyReportId}" name ="dailyReportId"> <button type="submit" class ="btn btn-primary">登録</button> </div> </div> </form>

試したこと

上記のコードでは条件を満たさない(入力としてはあっている)場合でも入力をはじいてしまいます。
isValidCompare単体だと正しくバリデーションされているのですが、isValidEqualも含めると正しく動作しません。
どのように修正すればよいでしょうか。

補足情報(FW/ツールのバージョンなど)

SpringBoot
Thymeleaf
Bootstrap
Java11
SpringToolSuite

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

isValidEqualメソッドのテストしましたか?

Java

1LocalDate.parse(value.getCreated()))==date

は全てfalseになるでしょう。

isValidCompareは isBefore を使用して比較しているのに
isValidEqualは == で比較なのでしょう?


追記
そもそも開始日 = 開始時刻(の日付)なら開始日の入力は不要ではないでしょうか。

投稿2021/10/18 23:25

Luice

総合スコア771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asahiko123

2021/10/19 02:25

回答ありがとうございます。 ご指摘の通り==は間違いでした。 equalsで比較させました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問