Spring 07

・useridの保存機能を修正しました。
問題点:UserEntityが値をもらえません。
解決方法:Controllerで値をもらって、保存します。

public ModelAndView form(
            @ModelAttribute("formModel") @RequestParam(value = "userid", required = true) String userid,
            UserEntity user, ModelAndView mav) {

        user.setUserId(userid);
        repository.saveAndFlush(user);
        return mav;
    }

Controllerで値をもらうのは、Controllerの役割じゃないと思います。
他の解決方法がないので、Controllerで値をもらいます。

 

・エラーメッセージを出力しました。
<li th:each="error : ${#fields.detailedErrors()}"
class="err" th:text="${error.message}" />

#fields
エンティティの各フィールドをバリデーションチェックした結果などがまとめられたオブジェクトです。

detailedErrors
発生したエラーに関する情報をひとまとめのリストとして返すメソッドです。


・各入力フィールドにエラーを表示
<input type="text" name="name" th:value="*{name}" th:errorclass="err" />
エラーが発生した際に適用されるクラス名を指定します。
エラーが起きたらテキストを赤い表示に変えます。

<div th:if="${#fields.hasErrors('name')}" th:errors="*{name}" th:errorclass="err">
エラーが発生している時だけ表示します。
このフィールドのエラーだけを表示します。


・エラーメッセージの日本語化
新しいプロパティファイルを追加しました。
org.hibernate.validator.constraints.NotBlank.message = 空白は不可です。
org.hibernate.validator.constraints.NotEmpty.message = 空白は不可です。
javax.validation.constraints.Max.message = {value} より小さくして下さい。
javax.validation.constraints.Min.message = {value} より大きくして下さい。
org.hibernate.validator.constraints.Email.message = メールアドレスではありません。


・オリジナルのバリデータを作成しました。

下記のクラスは入力したデータ型を確認する機能です。
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    @Override
    public void initialize(Phone phone) {
    }

    @Override
    public boolean isValid(String input, ConstraintValidatorContext cxt) {
        if (input == null) {
            return false;
        }
        return input.matches("[0-9()-]*");
    }

}


下記のインターフェースは新しいアノテーションを使えるようになるものです。
@Documented
@Constraint(validatedBy = PhoneValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @interface Phone {

    String message() default "please input a phone number.";

    Class<?> groups() default {};

    Class<? extends Payload>
payload() default {};

}

補充:
インターフェースとは、クラスに含まれるメソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したものです。
抽象メソッドは具体的な処理内容を記述せず、メソッド名や引数などの定義だけを宣言するメソッドです。


・Serializable(シリアライズ・直列化)
この機能を使うと、簡単にインスタンスを外部記憶装置などに保存し、インスタンスの情報を永続化することができます。


・@Controller、@Service、@Repository、@Componentの違い

@Controller
Spring MVCでコントローラー層のクラスに付与します。
Controller は、主に以下の役割を担います。
1.画面遷移の制御
2.ドメイン層の Service の呼出 (主処理を実行します。)

@Service
Sping MVCでサービス層のクラス(ビジネスロジック等)に付与します。
Service は業務処理を提供します。

@Repository
Spring MVCでデータ層のクラス(DAO等のDBアクセスを行うクラス)に付与します。

@Component
Spring MVCに限らず、SpringのDIコンテナにbeanとして登録したいクラスへ付与します。

 


@SuppressWarning
コンパイル・ユニットのサブセットに関するコンパイル警告を無効にできます。

@SuppressWarnings("unchecked")
unchecked : 未検査のオペレーションに関連する警告の抑止

@PersistenceContext
EntityManagerのbeanを取得してフィールドに設定します。