package com.pharmacopoeia.config; import com.pharmacopoeia.dto.ApiResponse; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; /** * 对标记了 {@link UnifiedResponse} 的 Controller / 方法, * 自动将返回值包装为统一的 {@link ApiResponse} 格式: * {@code {code: 200, message: "ok", data: <原返回值> }}。 * * */ @RestControllerAdvice public class UnifiedResponseBodyAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class> converterType) { // 类或方法上有 @UnifiedResponse 才包装 if (returnType.getMethodAnnotation(UnifiedResponse.class) != null) { return true; } return returnType.getContainingClass().getAnnotation(UnifiedResponse.class) != null; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (body instanceof ApiResponse || body instanceof byte[]) { return body; } if (body instanceof String) { return body; } return ApiResponse.success(body); } }