package com.talentcard.server.config; import java.util.stream.Collectors; import com.talentcard.server.business.admin.TicketPackageAdminController; import com.talentcard.server.business.portal.TicketPackagePortalController; import com.talentcard.server.common.ApiResponse; import com.talentcard.server.common.BusinessException; import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; 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.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; @Order(Ordered.HIGHEST_PRECEDENCE) @RestControllerAdvice(assignableTypes = { TicketPackageAdminController.class, TicketPackagePortalController.class }) public class TicketPackageExceptionHandler { private static final Logger log = LoggerFactory.getLogger(TicketPackageExceptionHandler.class); private static final int ERROR_CODE = 500; @ExceptionHandler(BusinessException.class) public ResponseEntity> handleBusinessException(BusinessException exception) { return error(exception.getMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleMethodArgumentNotValid(MethodArgumentNotValidException exception) { String message = exception.getBindingResult().getFieldErrors().stream() .map(error -> error.getDefaultMessage() == null ? error.getField() + "参数不正确" : error.getDefaultMessage()) .collect(Collectors.joining(";")); return error(message); } @ExceptionHandler(BindException.class) public ResponseEntity> handleBindException(BindException exception) { String message = exception.getBindingResult().getFieldErrors().stream() .map(error -> error.getDefaultMessage() == null ? error.getField() + "参数不正确" : error.getDefaultMessage()) .collect(Collectors.joining(";")); return error(message); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity> handleConstraintViolation(ConstraintViolationException exception) { String message = exception.getConstraintViolations().stream() .map(violation -> violation.getMessage()) .collect(Collectors.joining(";")); return error(message); } @ExceptionHandler(MissingServletRequestParameterException.class) public ResponseEntity> handleMissingRequestParameter(MissingServletRequestParameterException exception) { return error("请求参数不能为空:" + exception.getParameterName()); } @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException exception) { return error("请求参数格式不正确:" + exception.getName()); } @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity> handleUnreadableMessage(HttpMessageNotReadableException exception) { return error("请求内容格式不正确"); } @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception exception) { log.error("Ticket package request exception", exception); return error("服务器内部错误"); } private ResponseEntity> error(String message) { String safeMessage = message == null || message.isBlank() ? "服务器内部错误" : message; return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(ApiResponse.failure(ERROR_CODE, safeMessage)); } }