스프링부트에서 @Valid로 유효성 검사 시

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>

 

이런 구성인 경우 age에 문자를 입력 시 위와 같은 에러 메세지가 표시된다.

 

스프링부트인 경우

resources 폴더아래에

messages.properties 파일을 생성하고 아래와 같이 입력해 주면 된다.

typeMismatch.java.lang.Integer=숫자로 입력해 주세요.

+ Recent posts