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

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

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

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

Q&A

解決済

1回答

3034閲覧

Spring Boot 自作バリデーションが機能しない

chocolate_pie

総合スコア26

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

0グッド

0クリップ

投稿2020/01/09 03:02

前提・実現したいこと

レコードを画面から新規登録する際のバリデーションを
入力チェック:複数項目の相関チェックをするアノテーションの作り方 STS3 +Spring Boot+thymeleaf
に倣って作ったのですが、POSTメソッドにおいてFORMでエラーが起き、
先に進めませんでした。
デバックしましたが、Validatorのメソッドにも入っていません。

また、登録画面にエラーメッセージを出す際のThymeleafでもエラーが起きてしまったので、
その部分はコメントアウトしてあります。

最終的には、POSTした際に、登録できない値が入ったらエラーメッセージを画面に出したいです。

発生している問題・エラーメッセージ

エラーメッセージ Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'jp.co.itc.mbo.form.TeamGoalForm' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

該当のソースコード

TeamGoalForm.java

java

1import jp.co.itc.mbo.validation.TeamGoalYear; 2 3@TeamGoalYear(year="year",teamid="teamid") 4public class TeamGoalForm { 5private String teamgoal; 6 7private String year; 8 9private Integer teamid; 10 11public String getYear() { 12 return year; 13} 14public void setYear(String year) { 15 this.year = year; 16} 17public String getTeamgoal() { 18 return teamgoal; 19} 20public void setTeamgoal(String teamgoal) { 21 this.teamgoal = teamgoal; 22} 23public Integer getTeamid() { 24 return teamid; 25} 26public void setTeamid(Integer teamid) { 27 this.teamid = teamid; 28} 29}

TeamGoalYear.java

java

1@Documented 2@Constraint(validatedBy = {TeamGoalYearValidator.class}) // ここは後に作るバリデーションクラスです。 3@Target({TYPE,ANNOTATION_TYPE}) // 項目に対してバリデーションをかける場合はFIELDを選びます。 4@Retention(RUNTIME) 5@ReportAsSingleViolation 6public @interface TeamGoalYear { 7 String message() default "無効な年度です"; 8 Class<?>[] groups() default {}; 9 10 Class<? extends Payload>[] payload() default {}; 11 12 String year(); 13 String teamid(); 14 15 @Target({TYPE,ANNOTATION_TYPE}) 16 @Retention(RUNTIME) 17 @Documented 18 public @interface List { 19 //アノテーション名 20 TeamGoalYear[] value(); // インターフェース名[] value()としておいてください 21 } 22}

TeamGoalYearValidator.java

java

1public class TeamGoalYearValidator implements ConstraintValidator< TeamGoalYear, Object> { 2 3 public void isValid(TeamGoalYear constraintAnnotation) { 4 } 5 @Autowired 6 TeamGoalService teamgoalservice; 7 @Autowired 8 TeamGoalForm teamgoalform; 9 10 private String year; 11 private String teamid; 12 13 14 @Override 15 public void initialize(TeamGoalYear constraintAnnotation) { 16 this.year = constraintAnnotation.year(); 17 this.teamid = constraintAnnotation.teamid(); 18 19 } 20 21 public boolean isValid(Object form,ConstraintValidatorContext context) { 22 BeanWrapper beanWrapper = new BeanWrapperImpl(form); 23 String formyear = (String) beanWrapper.getPropertyValue(year); 24 Integer formteamid = (Integer) beanWrapper.getPropertyValue(teamid); 25 // String teamidstr=String.valueOf(teamid); 26 TeamGoal teamgoal=teamgoalservice.findCurrentOne(formteamid); 27 String teamgoalyear=teamgoal.getYear(); 28 if(teamgoalyear != formyear){ 29 return true; //通す 30 } 31 return false; 32 } 33 34 35}

Controller

java

1 @RequestMapping("/admin/teamgoal/new") 2 public String TeamGoalInput(@ModelAttribute("teamgoalform") TeamGoalForm teamgoalform,Model model ) { 3 4 List<DeptMaster> departments = deptmasterservice.findAll(); 5 model.addAttribute("departments", departments); 6 7 List<TeamMaster> teams = teammasterservice.findCurrent(); 8 model.addAttribute("teams", teams); 9 String year= teamgoalform.getYear(); 10 model.addAttribute("year",year); 11 12 return "admins/teamgoal_new"; 13 } 14 15 16 @RequestMapping(path = "/teamgoal/newcomplete", method = RequestMethod.POST) 17 public String createTeamGoal( @Valid TeamGoalForm teamgoalform,BindingResult bindingResult, Model model,Principal principal) { 18 19 List<DeptMaster> departments = deptmasterservice.findAll(); 20 model.addAttribute("departments", departments); 21 22 List<TeamMaster> teams = teammasterservice.findCurrent(); 23 model.addAttribute("teams", teams); 24 25 if(bindingResult.hasErrors()) { 26 return "admins/teamgoal_new"; 27 } 28 29 Authentication auth = (Authentication) principal; 30 UserMaster loginuser = (UserMaster) auth.getPrincipal(); 31 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); 32 33 TeamMaster teamid = teammasterservice.findOne(teamgoalform.getTeamid()); 34 35 TeamGoal teamgoal1 = new TeamGoal(); 36 teamgoal1.setTeamgoal(teamgoalform.getTeamgoal()); 37 teamgoal1.setYear(teamgoalform.getYear()); 38 teamgoal1.setTeamid(teamid); 39 teamgoal1.setDeleteflg(false); 40 teamgoal1.setUpdatedat(timestamp); 41 teamgoal1.setUpdatedby(loginuser.getId()); 42 teamgoal1.setCreatedat(timestamp); 43 teamgoalservice.save(teamgoal1); 44 return "redirect:/admin/teamgoals"; 45 }

teamgoal_new.html

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8"> 5<title>チーム目標新規登録</title> 6</head> 7<body> 8<h1>チーム目標新規登録</h1> 9<form method="post" 10 th:action="@{/teamgoal/newcomplete}" th:obhject="${year}"> 11<table> 12 <tr> 13 <th>年度</th> 14 <th>チーム名</th> 15 <th>チーム目標</th> 16 </tr> 17 <!-- th:object 1行分取ってくる --> 18 <tr > 19 <td><input type="text" name="year" > 20 <!-- <span class="error_msg" th:if="${#fields.hasErrors('year') th:errors="${year}"}>error!</span>--> 21 </td> 22 23<td><select name="teamid"> 24 <option th:each="team : ${teams}" th:text="${team.teamname}+'('+${team.deptid.deptname}+')'" 25 th:value="${team.id}" th:inline="text"></option> 26 </select></td> 27 <td><pre><textarea name="teamgoal" cols="40" rows="8" wrap="hard" required></textarea></pre></td> 28 </tr> 29 </table> 30 <input type="submit" value="登録する" /> 31 </form> 32 <button onclick="location.href='/admin/teamgoals'">戻る</button> 33</body> 34</html>

試したこと

・Formクラスの@TeamGoalYear(year="year",teamid="teamid")をコメントアウトするとエラーは解決できるが、バリデーションを付けることができない

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

STS4を利用しています。
初心者で至らない点があると思いますが宜しくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/11 03:33

多分パッケージの階層を理解してないんじゃないの?
guest

回答1

0

ベストアンサー

TeamGoalYearValidator にて、

java

1@Autowired 2TeamGoalForm teamgoalform;

が宣言されていますが、このValidator内でteamgoalformは使われておらず、また、TeamGoalForm はSpring管理beanでもありませんから、参照できずエラーとなります。


余談ですが、import文を省略すると正確な回答は得られにくくなります。

投稿2020/01/13 03:23

A-pZ

総合スコア12011

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

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

chocolate_pie

2020/01/14 05:32 編集

丁寧にご回答ありがとうございます。 見直してみると、抜け落ちている部分が多数あり、確認不足でした。 Formクラスに@Componemtを付けたら解決しました。 import文は入れたほうがよろしいのですね、ありがとうございます。以後気を付けさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問