Integer 등 숫자형에 문자열이 입력된 경우 typeMismatch 에러가 발생하며 아래와 같은 메세지가 결과물로 온다.
Failed to convert property value of type java.lang.String to required type java.lang.Integer for property age; nested exception is java.lang.NumberFormatException: For input string: "abcd"
이 문구를 바로 사용자에게 보여줄 수 없으므로 해당 에러인 경우 에러 메세지를 커스텀화 해야 한다.
dto
@Getter
@Setter
@ToString
public class PersonForm {
@NotBlank(message="이름을 입력해 주세요.")
@Size(min=2, max=30, message="글자수가 안맞아요.")
private String name;
@NotNull(message="나이를 입력해 주세요.")
@Min(value=18, message="나이는 최소한 18세이상으로 입력하세요.")
private Integer age;
}
controller
@PostMapping("/form")
public String validation_valid(@Valid PersonForm personForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return TEMPLATE_DIR.concat("form");
}
return "redirect:/" + TEMPLATE_DIR.concat("result");
}
html
<form id="frm" action="#" method="post" th:action="@{/validation/form}" th:object="${personForm}">
name : <input th:field="*{name}"><br>
<div class="error" th:if="${#fields.hasErrors('name')}" th:errors="*{name}"> Name Error</div>
age : <input th:field="*{age}"><br>
<div th:if="${#fields.hasErrors('age')}" th:errors="*{age}"> Age Error</div>
<button type="submit">Submit</button>
</form>
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.templateresolver.UrlTemplateResolver;
@Configuration
public class SpringTemplateConfig {
// UrlTemplateResolver를 빈으로 등록
@Bean
public UrlTemplateResolver urlTemplateResolver() {
return new UrlTemplateResolver();
}
}