@Valid/@NotBlankなど)HTMLフォーム → DTO(Formクラス) → Controller → Service → Repository
@Validで自動検証BidingResultに格納import jakarta.validation.constraints.*;
public class UserForm {
@NotBlank(message = "名前を入力してください")
private String name;
@Min(value = 0, message = "年齢は0以上でなければなりません")
@Max(value = 120, message = "年齢は120以下でなければなりません")
private int age;
@Email(message = "メールアドレスの形式が不正です")
private String email;
// getter / setter 省略
}
@NotBlank:空文字不可(nullと空白の両方を弾く)@Email:形式チェック@Min / @Max:数値の範囲制限import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
// POSTフォーム受け取り
@PostMapping("/register")
public String registerUser(@RequestBody @Valid UserForm form, BindingResult result) {
if (result.hasErrors()) {
// バリデーションエラー内容を返す
return result.getAllErrors().toString();
}
userService.createUser(form);
return "登録成功!";
}
}
@Valid:自動でフォームの値を検証BindingResult:エラー結果を受け取るオブジェクトimport org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
public void createUser(UserForm form) {
User user = new User();
user.setName(form.getName());
user.setAge(form.getAge());
user.setEmail(form.getEmail());
repository.save(user);
}
}
<form th:action="@{/users/register}" method="post" th:object="${userForm}">
<input type="text" th:field="*{name}" placeholder="名前">
<input type="number" th:field="*{age}" placeholder="年齢">
<input type="email" th:field="*{email}" placeholder="メール">
<button type="submit">送信</button>
<div th:if="${#fields.hasErrors('*')}">
<ul>
<li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
</ul>
</div>
</form>
@NotBlank:空文字不可@NotNull:null不可@Min / @Max:数値の範囲制限@Size(min, max):文字列の長さ制限@Email:メール形式チェック@Pattern(regaxp="..."):正規パターン表現→ 次:例外処理