前処理後処理(2)
18261 ワード
前処理
Springbootで検証するにはSpringBoot Starter Validationというライブラリが必要です.
mvnrepositoryからダウンロードできます.
dependencyを追加すると、コントローラは@validという構文を使用できます.
(java.validation言語タイプはこちらです。と決定できます)
//SignupReqDto
@Data //lombok
public class SignupReqDto {
@Size(min = 2, max = 20)
@NotBlank()
private String username;
@NotBlank()
private String password;
}
//Controller
@PostMapping("/")
public String signup(@Valid SignupReqDto signupReqDto, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
Map<String,String> errorMap = new HashMap<>();
for(FieldError error:bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
}
throw new RuntimeException("유효성 검사 실패");
} else {
//회원가입 진행
return "signin";
}
}
SignupReqDto注記を追加して検証した場合、問題が発生した場合はBindingResultクラスで転送できます.コントローラには次のコードが表示されます.
if (bindingResult.hasErrors()) {
Map<String,String> errorMap = new HashMap<>();
for(FieldError error:bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
}
throw new RuntimeException("유효성 검사 실패");
} else {
//회원가입 진행
return "signin";
}
bindingResultでエラーが発生した場合、問題が発生したフィールド名とエラーメッセージをMapに保存し、RuntimeExceptionを放出します.しかし、これによりユーザーにエラー画面全体が表示されます.これをより簡潔に伝えるために、以下の操作を行います.
//ControllerExceptionHandler
@RestController
@ControllerAdvice //모든 exception을 낚아챔
public class ControllerExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public String validationException(RuntimeException e) {
return e.getMessage();
}
ただしRunTimeExceptionはstringのみを受信しているためerrorMapを渡すことはできません.したがって、RunTimeExceptionを継承するクラスを作成する必要があります.
//CustomValidationException
public class CustomValidationException extends RuntimeException{
// 객체를 구분할 때 사용
private static final long serialVersionUID = 1L;
private Map<String, String> errorMap;
public CustomValidationException(String message, Map<String, String> errorMap) {
super(message);
this.errorMap = errorMap;
}
public Map<String, String> getErrorMap() {
return errorMap;
}
}
RuntimeExceptionにメッセージを送信すると、RuntimeExceptionはそのメッセージを親(Exception)に、Exceptionはそのメッセージを親(Throwable)に投げます.その後、ThrowableのgetMessage関数でメッセージを受信するので、super(message)を使用してメッセージを受信することができます.このようにしてCustomValidationExceptionを作成し、RuntimeException部分をCustomValidationExceptionに変換し、戻りタイプをMap
//ControllerExceptionHandler
@RestController
@ControllerAdvice //모든 exception을 낚아챔
public class ControllerExceptionHandler {
@ExceptionHandler(CustomValidationException.class)
public Map<String, String> validationException(CustomValidationException e) {
return e.getMessage();
}
また、「検証に失敗した」というメッセージを表示する場合は、ControllerExceptionHandlerの戻りタイプを共通Dtoに変換する共通Dtoを作成します. //CommonResDto
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CommonResDto<T>{
private String message;
private T data;
}
//ControllerExceptionHandler
@RestController
@ControllerAdvice //모든 exception을 낚아챔
public class ControllerExceptionHandler {
@ExceptionHandler(CustomValidationException.class)
public CommonResDto<?>validationException(CustomValidationException e) {
return new CommpnResDto<Map<String, String>>(e.getMessage(), e.getErrorMap();
}
Reference
この問題について(前処理後処理(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@stackin/전처리-후처리2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol