package com.oms.common; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import jakarta.servlet.http.HttpServletRequest; @Slf4j @RestControllerAdvice public class GlobalResponseAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class> converterType) { String className = returnType.getDeclaringClass().getName(); return className.startsWith("com.oms.controller"); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType contentType, Class> converterType, ServerHttpRequest request, ServerHttpResponse response) { if (body == null) { return ApiResponse.success(); } if (body instanceof ApiResponse) { return body; } if (body instanceof ResponseEntity) { ResponseEntity re = (ResponseEntity) body; return ApiResponse.success(re.getBody()); } return ApiResponse.success(body); } @ExceptionHandler(Exception.class) public ApiResponse handleException(Exception e, HttpServletRequest request) { log.error("接口 {} 异常: {}", request.getRequestURI(), e.getMessage(), e); return ApiResponse.serverError("服务器内部错误: " + e.getMessage()); } @ExceptionHandler(IllegalArgumentException.class) public ApiResponse handleIllegalArgument(IllegalArgumentException e, HttpServletRequest request) { return ApiResponse.badRequest(e.getMessage()); } @ExceptionHandler(NullPointerException.class) public ApiResponse handleNullPointer(NullPointerException e, HttpServletRequest request) { log.error("接口 {} 空指针异常: {}", request.getRequestURI(), e.getMessage(), e); return ApiResponse.serverError("数据不存在或未初始化"); } }