ExceptionControllerAdvisor.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package com.its.op.exception;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.http.HttpStatus;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.validation.BindingResult;
  6. import org.springframework.validation.FieldError;
  7. import org.springframework.web.bind.MethodArgumentNotValidException;
  8. import org.springframework.web.bind.annotation.ControllerAdvice;
  9. import org.springframework.web.bind.annotation.ExceptionHandler;
  10. import javax.servlet.http.HttpServletRequest;
  11. import java.time.LocalDateTime;
  12. import java.util.ArrayList;
  13. import java.util.Collections;
  14. import java.util.List;
  15. import java.util.NoSuchElementException;
  16. @Slf4j
  17. @ControllerAdvice
  18. public class ExceptionControllerAdvisor {//} extends ResponseEntityExceptionHandler {
  19. private String fieldName2JsonName(String str){
  20. boolean isFound = false;
  21. StringBuilder sb = new StringBuilder();
  22. for (char x : str.toCharArray()) {
  23. if (Character.isUpperCase(x)) {
  24. sb.append("_").append(Character.toLowerCase(x));
  25. isFound = true;
  26. } else {
  27. sb.append(x);
  28. }
  29. }
  30. return isFound ? sb.toString() : "";
  31. }
  32. /**
  33. * Validation error
  34. * @param ex
  35. * @param request
  36. * @return
  37. */
  38. @ExceptionHandler(MethodArgumentNotValidException.class)
  39. public ResponseEntity<ErrorResponse> methodValidException(HttpServletRequest request, MethodArgumentNotValidException ex) {
  40. List<String> errorList = new ArrayList<>();
  41. BindingResult bindingResult = ex.getBindingResult();
  42. for (FieldError fieldError : bindingResult.getFieldErrors()) {
  43. StringBuilder builder = new StringBuilder();
  44. String fieldName = fieldName2JsonName(fieldError.getField());
  45. if ("".equals(fieldName)) {
  46. fieldName = fieldError.getField();
  47. } else {
  48. fieldName = fieldError.getField() + "(" + fieldName + ")";
  49. }
  50. builder.append("[");
  51. builder.append(fieldName);
  52. builder.append("](은)는 ");
  53. builder.append(fieldError.getDefaultMessage());
  54. builder.append(" 입력된 값: [");
  55. builder.append(fieldError.getRejectedValue());
  56. builder.append("]");
  57. errorList.add(builder.toString());
  58. }
  59. // List<String> errorList = ex
  60. // .getBindingResult()
  61. // .getFieldErrors()
  62. // .stream()
  63. // .map(DefaultMessageSourceResolvable::getDefaultMessage)
  64. // .collect(Collectors.toList());
  65. ErrorResponse response = ErrorResponse.builder()
  66. .timestamp(LocalDateTime.now())
  67. .status(HttpStatus.BAD_REQUEST.value())
  68. .title("Arguments Not Valid(Bad Request)")
  69. .message("요청 데이터가 유효하지 않습니다.")
  70. .errors(errorList)
  71. .path(request.getRequestURI())
  72. .build();
  73. log.error("{}", response.toString());
  74. return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
  75. }
  76. /**
  77. * Data not found
  78. * @param request
  79. * @param ex
  80. * @return
  81. */
  82. @ExceptionHandler({NoSuchElementException.class})
  83. public ResponseEntity<ErrorResponse> exceptionHandler(HttpServletRequest request, final NoSuchElementException ex) {
  84. List<String> errorList = new ArrayList<>(Collections.singletonList(ex.getMessage()));
  85. ErrorResponse response = ErrorResponse.builder()
  86. .timestamp(LocalDateTime.now())
  87. .status(HttpStatus.NOT_FOUND.value())
  88. .title("Data Not Found")
  89. .message(ex.getMessage())
  90. .path(request.getRequestURI())
  91. .errors(errorList)
  92. .build();
  93. //log.error("{}", response.toString());
  94. return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
  95. }
  96. @ExceptionHandler({RuntimeException.class})
  97. public ResponseEntity<ErrorResponse> exceptionHandler(HttpServletRequest request, final RuntimeException ex) {
  98. List<String> errorList = new ArrayList<>(Collections.singletonList(ex.getMessage()));
  99. ErrorResponse response = ErrorResponse.builder()
  100. .timestamp(LocalDateTime.now())
  101. .status(HttpStatus.EXPECTATION_FAILED.value())
  102. .title("RuntimeException")
  103. .message(ex.getMessage())
  104. .path(request.getRequestURI())
  105. .errors(errorList)
  106. .build();
  107. //log.error("{}", response.toString());
  108. return new ResponseEntity<>(response, HttpStatus.EXPECTATION_FAILED);
  109. }
  110. @ExceptionHandler({Exception.class})
  111. public ResponseEntity<ErrorResponse> exceptionHandler(HttpServletRequest request, final Exception ex) {
  112. List<String> errorList = new ArrayList<>(Collections.singletonList(ex.getMessage()));
  113. ErrorResponse response = ErrorResponse.builder()
  114. .timestamp(LocalDateTime.now())
  115. .status(HttpStatus.EXPECTATION_FAILED.value())
  116. .title("Exception")
  117. .message(ex.getMessage())
  118. .path(request.getRequestURI())
  119. .errors(errorList)
  120. .build();
  121. //log.error("{}", response.toString());
  122. return new ResponseEntity<>(response, HttpStatus.EXPECTATION_FAILED);
  123. }
  124. }