package com.talentcard.server.common; import java.util.stream.Collectors; import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(BusinessException.class) public ResponseEntity> handleBusinessException(BusinessException exception) { HttpStatus status = HttpStatus.valueOf(exception.errorCode().code()); return ResponseEntity.status(status) .body(ApiResponse.failure(exception.errorCode().code(), exception.getMessage())); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleMethodArgumentNotValid(MethodArgumentNotValidException exception) { String message = exception.getBindingResult().getFieldErrors().stream() .map(error -> error.getField() + " " + error.getDefaultMessage()) .collect(Collectors.joining("; ")); return badRequest(message); } @ExceptionHandler(BindException.class) public ResponseEntity> handleBindException(BindException exception) { String message = exception.getBindingResult().getFieldErrors().stream() .map(error -> error.getField() + " " + error.getDefaultMessage()) .collect(Collectors.joining("; ")); return badRequest(message); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity> handleConstraintViolation(ConstraintViolationException exception) { String message = exception.getConstraintViolations().stream() .map(violation -> violation.getPropertyPath() + " " + violation.getMessage()) .collect(Collectors.joining("; ")); return badRequest(message); } @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity> handleUnreadableMessage(HttpMessageNotReadableException exception) { return badRequest("请求内容格式不正确"); } @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception exception) { log.error("Unhandled request exception", exception); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(ApiResponse.failure(ErrorCode.INTERNAL_ERROR.code(), ErrorCode.INTERNAL_ERROR.message())); } private ResponseEntity> badRequest(String message) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(ApiResponse.failure(ErrorCode.BAD_REQUEST.code(), message)); } }