Skip to content

Commit

Permalink
fix: include request message headers in the error message
Browse files Browse the repository at this point in the history
  • Loading branch information
psychology50 committed Dec 31, 2024
1 parent 04a8d15 commit fc8d5d7
Showing 1 changed file with 41 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
package kr.co.pennyway.socket.common.exception;

import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import kr.co.pennyway.common.exception.GlobalErrorException;
import kr.co.pennyway.common.exception.ReasonCode;
import kr.co.pennyway.common.exception.StatusCode;
import kr.co.pennyway.socket.common.dto.ServerSideMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

import java.security.Principal;
import java.util.Map;

import static kr.co.pennyway.common.exception.ReasonCode.TYPE_MISMATCH_ERROR_IN_REQUEST_BODY;

/**
* λΉ„μ§€λ‹ˆμŠ€ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” μ „μ—­ ν•Έλ“€λŸ¬.
Expand All @@ -20,36 +26,57 @@
@RequiredArgsConstructor
public class WebSocketGlobalExceptionHandler {
private static final String ERROR_DESTINATION = "/queue/errors";
private static final String MESSAGE_ID = "message-id";

private final SimpMessagingTemplate template;

@MessageExceptionHandler(GlobalErrorException.class)
public void handleGlobalErrorException(Principal principal, StompHeaderAccessor accessor, GlobalErrorException ex) {
ServerSideMessage serverSideMessage = ServerSideMessage.of(ex.causedBy().getCode(), ex.getBaseErrorCode().getExplainError());
public void handleGlobalErrorException(Principal principal, StompHeaderAccessor accessor, GlobalErrorException e) {
ServerSideMessage serverSideMessage = ServerSideMessage.of(e.causedBy().getCode(), e.getBaseErrorCode().getExplainError());
log.warn("handleGlobalErrorException: {}", serverSideMessage);

sendErrorMessage(principal, serverSideMessage, accessor.getFirstNativeHeader(MESSAGE_ID));
sendErrorMessage(principal, serverSideMessage, accessor);
}

@MessageExceptionHandler(MethodArgumentTypeMismatchException.class)
public void handleMethodArgumentTypeMismatchException(Principal principal, StompHeaderAccessor accessor, MethodArgumentTypeMismatchException e) {
String code = String.valueOf(StatusCode.UNPROCESSABLE_CONTENT.getCode() * 10 + TYPE_MISMATCH_ERROR_IN_REQUEST_BODY.getCode());
ServerSideMessage serverSideMessage = ServerSideMessage.of(code, e.getMessage());
log.warn("handleMethodArgumentTypeMismatchException: {}", serverSideMessage);

sendErrorMessage(principal, serverSideMessage, accessor);
}

@MessageExceptionHandler(HttpMessageNotReadableException.class)
public void handleHttpMessageNotReadableException(Principal principal, StompHeaderAccessor accessor, HttpMessageNotReadableException e) {
String code, message;
if (e.getCause() instanceof MismatchedInputException mismatchedInputException) {
code = String.valueOf(StatusCode.UNPROCESSABLE_CONTENT.getCode() * 10 + TYPE_MISMATCH_ERROR_IN_REQUEST_BODY.getCode());
message = mismatchedInputException.getPath().get(0).getFieldName() + " ν•„λ“œμ˜ 값이 μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.";
} else {
code = String.valueOf(StatusCode.BAD_REQUEST.getCode() * 10 + ReasonCode.MALFORMED_REQUEST_BODY.getCode());
message = e.getMessage();
}

ServerSideMessage serverSideMessage = ServerSideMessage.of(code, message);
log.warn("handleHttpMessageNotReadableException: {}", serverSideMessage);

sendErrorMessage(principal, serverSideMessage, accessor);
}

@MessageExceptionHandler(Exception.class)
public void handleException(Principal principal, StompHeaderAccessor accessor, Exception ex) {
ServerSideMessage serverSideMessage = ServerSideMessage.of("5000", ex.getMessage());
public void handleException(Principal principal, StompHeaderAccessor accessor, Exception e) {
ServerSideMessage serverSideMessage = ServerSideMessage.of("5000", e.getMessage());
log.error("handleException: {}", serverSideMessage);

sendErrorMessage(principal, serverSideMessage, accessor.getFirstNativeHeader(MESSAGE_ID));
sendErrorMessage(principal, serverSideMessage, accessor);
}

private void sendErrorMessage(Principal principal, ServerSideMessage serverSideMessage, String messageId) {
private void sendErrorMessage(Principal principal, ServerSideMessage serverSideMessage, StompHeaderAccessor accessor) {
if (principal == null) {
log.warn("μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•  μ‚¬μš©μžκ°€ μ—†μŠ΅λ‹ˆλ‹€.");
return;
}

if (messageId == null) {
template.convertAndSendToUser(principal.getName(), ERROR_DESTINATION, serverSideMessage);
} else {
template.convertAndSendToUser(principal.getName(), ERROR_DESTINATION, serverSideMessage, Map.of(MESSAGE_ID, messageId));
}
template.convertAndSendToUser(principal.getName(), ERROR_DESTINATION, serverSideMessage, accessor.getMessageHeaders());
}
}

0 comments on commit fc8d5d7

Please sign in to comment.