前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/19 02:25