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

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

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

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

Spring Boot

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

Q&A

解決済

1回答

15885閲覧

カスタムバリデーションがエラーになる

sakuraicamp

総合スコア16

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2017/07/04 12:41

編集2017/07/04 13:05

Spring Boot でユーザ登録機能を作成中です。
その中で登録済みのメールアドレスをバリデーションする処理を作ってみたところ、
HV000028: Unexpected exception during isValid call. となります。

  1. アノテーションクラスを作成
  2. 実際にバリデーションするクラスを作成
  3. Modelにアノテーションを追加

NetBeansからデバッグしたところ、valueという変数には入力した内容が入っていました。

初心者で問題の切り分け方法がわからないのでアドバイスいただければ幸いです

UserService

public User findByMail(String mail){ return userRepository.findByMail(mail); }

Unused.java (アノテーションクラス)

@Documented @Constraint(validatedBy = {UnusedValidator.class}) @Target({FIELD}) @Retention(RUNTIME) public @interface Unused { String message() default "登録済みメールアドレスです"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({FIELD}) @Retention(RUNTIME) @Documented public @interface List { Unused[] value(); } }

UnusedValidator

@Component public class UnusedValidator implements ConstraintValidator<Unused, String> { @Autowired UserService userService; public void initialize(Unused constraintAnnotation) { } public boolean isValid(String value, ConstraintValidatorContext context) { User user = userService.findByMail(value); if(user == null){ return true; } return false; } }

User(Model)

@NotBlank @Column(name = "mail") @Unused private String mail;

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

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

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

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

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

guest

回答1

0

ベストアンサー

Controllerの実装がなかったので別途私の環境でControllerとThymeleafテンプレートを作成し、Serviceまで同じ実装をしましたが、特に問題はないようです。

発生している現象を察するに、userService.findByMail(value) から実行されている userRepository.findByMail(mail) にて何らかの例外が発生しているのではないでしょうか。

問題切り分けするために、一度 userService.findByMail(value) の結果を return new User();などでスタブ化し、そこで問題がなければ、repositoryの取得が失敗しているか、repositoryからデータを参照している処理で何らかの失敗があるかと思います。

投稿2017/07/04 15:05

A-pZ

総合スコア12011

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

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

sakuraicamp

2017/07/05 11:07 編集

A-pZ さん コメントありがとうございます。 申し訳ありません、自分の実力がなく切り分けすることすらできない状況です。。 ①アノテーションにバリデーションをする処理は、Controller → Service → Model とするとどういう順番で処理されるのでしょうか。 ②Controller クラスを記載しますので、アドバイスいただけないでしょうか。 Controller @RequestMapping(path = "create", method = RequestMethod.GET) public String form(AccountForm accountForm, Model model) { model.addAttribute("AccountForm", accountForm); return "account/form"; } @RequestMapping(path = "confirm", method = RequestMethod.POST) public String createConfirm(@Valid AccountForm accountForm, BindingResult result, Model model, RedirectAttributes redirectAttributes){ if (result.hasErrors()){ return "account/form"; } model.addAttribute("AccountForm", accountForm); return "account/confirm"; } @RequestMapping(path = "regist", method = RequestMethod.POST) public String regist( AccountForm accountForm, Model model){ userService.regist(accountForm); return "account/regist"; }
A-pZ

2017/07/05 11:44

ValidationはControllerで定義しているメソッドの引数に@Validがついているものに対して行います。つまりControllerと記載していただいたソースのAccountFormに対して実行されます。Userクラスにつけるのでもやり方次第でValidationは発動しますが、まずはUserにつけているValidation定義を、AccountFormにつけてみると、わかりやすいかと思います。
sakuraicamp

2017/07/08 14:45

A-pZさん ご連絡が遅くなってしまい、大変申し訳ありません。 Controller 側にValidationのアノテーションを設定した場合も、バリデーションが機能しなかった(特にエラーも表示されず)状況です。 ①最初の投稿で、Repository、Service、アノテーションクラスを投稿したのですが、Controllerクラス、Viewにもバリデーションをするために、必要なことがあるのでしょうか。
A-pZ

2017/07/08 16:32

"バリデーションが機能しなかった" のは、書いていただいたControllerクラスで、/confirm つまり createConfirmメソッド で正しいですよね? このcreateConfirmメソッドでは、もしValidationエラーがあったときはresult.hasErrors()がtrueとなります。Validationが正しく発動しているかはView(thymeleafのHTMLやJSPなど)でエラー表示できていればわかります。ないしはデバッグモードでブレークポイントを設定するなどで確認ができます。 念のため送信しているHTMLないしはJSPのform部分も書いていただくと解決できるかもしれません。
sakuraicamp

2017/07/09 12:41

A-pZ さん すみません。前々回回答いただいた AccountFormクラス に作成したバリデーションのアノテーションをつけることで、解決いたしました。 何度もコメントいただいて本当にありがとうございます。。大変助かりました涙。。
A-pZ

2017/07/09 13:11

d(・ω・ グッ 壁を乗り越えれば強くなります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問