83431


パスワード（pass）とパスワード再入力（reenter）が同じだった場合インサートが実行され、同じでない場合はエラーメッセージを表示してインサートしない、といったものを作っています。

しかし現状では、同じ値なのにエラーメッセージが出たり  
お互い未入力なのにメッセージが出なかったり  
といった感じです。

また、値が同じでエラーメッセージが表示されず（成功かな？）と思いそのまま値を別(reenterとpassをバラバラの値)にして再度登録を押すと、本来エラーメッセージが出るはずなのに出なかったりと訳が分かりません。

前提としてインサートは問題なく行えています。

教授していただきたく思います。

[code]

    import javax.validation.constraints.AssertTrue; 
    @Getter
    @Setter
    public class CreateForm {
        @NotBlank
        private String id;
        @NotBlank
        private String pass;
        @NotBlank
        private String reenter;
        @AssertTrue(message = "PASSが一致しません")
            public boolean isCheck() {
                if (pass != reenter) return true;
                    return false;
            }
        @NotBlank
        private String name;
        @NotBlank
        private String kana;
        @NotBlank
        private String birth;
        @NotBlank
        private String club;
    }
    
[/code]

[code]

    <form action="#" th:action="@{/create}" th:object="${createForm}" method="post">
        <table>
            <tr>
                <th>id</th>
                <td><input type="text" name="id" th:field="*{id}"><br>
                    <span th:if="${#fields.hasErrors('id')}" th:errors="*{id}"></span></td>
            </tr>
            <tr>
                <th>pass</th>
                <!-- ポイント2 -->
                <td><input type="text" name="pass" th:field="*{pass}"><br>
                    <span th:if="${#fields.hasErrors('pass')}" th:errors="*{pass}"></span></td>
            </tr>
            <tr>
                <th>reenter</th>
                <td><input type="text" name="reenter" th:field="*{reenter}"><br>
                    <span th:if="${#fields.hasErrors('reenter')}"
                    th:errors="*{reenter}"></span></td>
            </tr>
            <tr>
                <td><span th:if="${#fields.hasErrors('check')}"
                    th:errors="*{check}"></span></td>
            </tr>
            <tr>
                <th>name</th>
                <td><input type="text" name="name" th:field="*{name}"><br>
                    <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span></td>
            </tr>
            <tr>
                <th>kana</th>
                <td><input type="text" name="kana" th:field="*{kana}"><br>
                    <span th:if="${#fields.hasErrors('kana')}" th:errors="*{kana}"></span></td>
            </tr>
    
            <tr>
                <th>birth</th>
                <td><input type="text" name="birth" th:field="*{birth}"><br>
                    <span th:if="${#fields.hasErrors('birth')}" th:errors="*{birth}"></span></td>
            </tr>
            <tr>
                <th>club</th>
                <td><input type="text" name="club" th:field="*{club}"><br>
                    <span th:if="${#fields.hasErrors('club')}" th:errors="*{club}"></span></td>
            </tr>
    
        </table>
        <input type="submit" value="登録">
    </form>
    </body>
    </html>
    
[/code]

[code]

    @GetMapping("create")
    String create(@ModelAttribute CreateForm customerForm) {
        return "create";
    }
    
    @PostMapping("create")
    String regist(@Validated @ModelAttribute CreateForm createForm,
        BindingResult result,
        Model model) {
        if(result.hasErrors()) {
            return create(createForm);
        }
        User user = new User();
        Userdetail userdetail = new Userdetail();
        BeanUtils.copyProperties(createForm, user);
        BeanUtils.copyProperties(createForm, userdetail);
        sevi.insert(user);
        sevi.insert2(userdetail);
    
        return "redirect:/create";
    }
    
[/code]


CC BY-SA 4.0
2021-11-04T12:45:04.633
83428
2021-11-05T00:51:30.940
2021-11-05T00:51:30.940
3060
48204
question
java mysql spring spring-boot
アノテーション @AssertTrue での入力値チェックが意図した通り動作しない


Java の文字列比較は `==`( や `!=` )でなく
[`String#equals()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/String.html#equals\(java.lang.Object\))
メソッドや
[`Objects.equals()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Objects.html#equals\(java.lang.Object,java.lang.Object\))メソッドを用います。

おそらく意図している実装は次のものではないでしょうか。

[code]

    import java.util.Objects;
    // ...
    
      @AssertTrue(message = "PASSが一致しません")
      public boolean isCheck() {
        return Objects.equals(pass, reenter);
      }
    
[/code]

関連:

  * [Javaの文字列の比較について](https://ja.stackoverflow.com/q/24297/2808)
  * [String型を==で比較したときの挙動が予想と違う](https://ja.stackoverflow.com/q/63088/2808)


CC BY-SA 4.0
2021-11-04T13:16:02.270
83431
2021-11-04T13:22:35.900
2021-11-04T13:22:35.900
2808
2808
83428
answer