feat: Exception Handler 구현
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.exception.AlreadyDeletedException;
|
||||||
|
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class AlreadyDeletedHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(value = AlreadyDeletedException.class)
|
||||||
|
protected ResponseEntity<ErrorResponseDTO> handleException(AlreadyDeletedException e) {
|
||||||
|
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
|
||||||
|
return ResponseEntity.status(HttpStatus.CONFLICT).body(errorDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.validation.FieldError;
|
||||||
|
import org.springframework.validation.ObjectError;
|
||||||
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class CustomMethodArgumentNotValidHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(value = MethodArgumentNotValidException.class)
|
||||||
|
protected ResponseEntity<ErrorResponseDTO> handleException(MethodArgumentNotValidException e) {
|
||||||
|
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
|
||||||
|
List<String> messages = getMessages(allErrors.iterator());
|
||||||
|
|
||||||
|
ErrorResponseDTO result = ErrorResponseDTO.of(e.getClass().getSimpleName(), messages);
|
||||||
|
return ResponseEntity.badRequest().body(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getMessages(Iterator<ObjectError> errorIterator) {
|
||||||
|
List<String> messages = new ArrayList<>();
|
||||||
|
|
||||||
|
while (errorIterator.hasNext()) {
|
||||||
|
StringBuilder messageBuilder = new StringBuilder();
|
||||||
|
ObjectError error = errorIterator.next();
|
||||||
|
messageBuilder
|
||||||
|
.append("['")
|
||||||
|
.append(((FieldError) error).getField()) // 유효성 검사가 실패한 속성
|
||||||
|
.append("' is '")
|
||||||
|
.append(((FieldError) error).getRejectedValue()) // 유효하지 않은 값
|
||||||
|
.append("' :: ")
|
||||||
|
.append(error.getDefaultMessage()) // 유효성 검사 실패 시 메시지
|
||||||
|
.append("]");
|
||||||
|
|
||||||
|
log.error(messageBuilder.toString());
|
||||||
|
messages.add(messageBuilder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.exception.EmailNotFoundException;
|
||||||
|
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class EmailNotFoundHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(value = EmailNotFoundException.class)
|
||||||
|
protected ResponseEntity<ErrorResponseDTO> handleException(EmailNotFoundException e) {
|
||||||
|
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
|
||||||
|
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.exception.PasswordMismatchException;
|
||||||
|
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.authentication.BadCredentialsException;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class PasswordMismatchHandler {
|
||||||
|
|
||||||
|
private static final String MESSAGE = "패스워드가 일치하지 않습니다";
|
||||||
|
|
||||||
|
@ExceptionHandler(value = {PasswordMismatchException.class, BadCredentialsException.class})
|
||||||
|
protected ResponseEntity<ErrorResponseDTO> handleException(RuntimeException e) {
|
||||||
|
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(MESSAGE));
|
||||||
|
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(errorDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle;
|
||||||
|
|
||||||
|
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
@Order
|
||||||
|
public class RuntimeHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(value = RuntimeException.class)
|
||||||
|
protected ResponseEntity<ErrorResponseDTO> handleException(RuntimeException e) {
|
||||||
|
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
|
||||||
|
return ResponseEntity.badRequest().body(errorDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.ticketing.server.global.exception.handle.dto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public class ErrorResponseDTO {
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
private List<String> messages;
|
||||||
|
|
||||||
|
private ErrorResponseDTO(String code, List<String> messages) {
|
||||||
|
this.code = code;
|
||||||
|
this.messages = messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ErrorResponseDTO of(String code, List<String> messages) {
|
||||||
|
return new ErrorResponseDTO(code, messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ public class UserServiceImpl implements UserService {
|
|||||||
public User register(@Valid SignUpDTO signUpDto) {
|
public User register(@Valid SignUpDTO signUpDto) {
|
||||||
Optional<User> user = userRepository.findByEmail(signUpDto.getEmail());
|
Optional<User> user = userRepository.findByEmail(signUpDto.getEmail());
|
||||||
if (user.isPresent()) {
|
if (user.isPresent()) {
|
||||||
log.error("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다. :: {}", signUpDto);
|
log.error("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다. :: {}", signUpDto.getEmail());
|
||||||
throw new IllegalArgumentException("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다.");
|
throw new IllegalArgumentException("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
validation.not.empty.name="\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.name=\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.email="\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.email=\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.password="\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.password=\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.oldpassword="\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.oldpassword=\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.newpassword="\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.newpassword=\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.grade="\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.grade=\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.phone="\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.phone=\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.email="\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."
|
validation.email=\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
||||||
validation.phone="\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."
|
validation.phone=\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
||||||
validation.password.not.change="\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."
|
validation.password.not.change=\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
validation.not.empty.name="name is required."
|
validation.not.empty.name=name is required.
|
||||||
validation.not.empty.email="email is required."
|
validation.not.empty.email=email is required.
|
||||||
validation.not.empty.password="password is required."
|
validation.not.empty.password=password is required.
|
||||||
validation.not.empty.oldpassword="Old Password is required."
|
validation.not.empty.oldpassword=Old Password is required.
|
||||||
validation.not.empty.newpassword="New Password is required."
|
validation.not.empty.newpassword=New Password is required.
|
||||||
validation.not.empty.grade="user grade is required."
|
validation.not.empty.grade=user grade is required.
|
||||||
validation.not.empty.phone="phone is required."
|
validation.not.empty.phone=phone is required.
|
||||||
validation.email="email is not valid."
|
validation.email=email is not valid.
|
||||||
validation.phone="phone is not valid."
|
validation.phone=phone is not valid.
|
||||||
validation.password.not.change="password not change."
|
validation.password.not.change=password not change.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
validation.not.empty.name="\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.name=\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.email="\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.email=\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.password="\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.password=\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.oldpassword="\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.oldpassword=\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.newpassword="\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.newpassword=\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.grade="\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.grade=\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.not.empty.phone="\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4."
|
validation.not.empty.phone=\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
|
||||||
validation.email="\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."
|
validation.email=\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
||||||
validation.phone="\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."
|
validation.phone=\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
||||||
validation.password.not.change="\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."
|
validation.password.not.change=\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
|
||||||
|
|||||||
Reference in New Issue
Block a user