diff --git a/src/main/java/com/hxgk/lowcode/utils/sm4/DecryptedArgumentResolver.java b/src/main/java/com/hxgk/lowcode/utils/sm4/DecryptedArgumentResolver.java index 3772076..b8fd3c5 100644 --- a/src/main/java/com/hxgk/lowcode/utils/sm4/DecryptedArgumentResolver.java +++ b/src/main/java/com/hxgk/lowcode/utils/sm4/DecryptedArgumentResolver.java @@ -1,5 +1,6 @@ package com.hxgk.lowcode.utils.sm4; +import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; @@ -10,6 +11,7 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; @Slf4j @Component @@ -27,18 +29,41 @@ public class DecryptedArgumentResolver implements HandlerMethodArgumentResolver NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); + + // 获取解密后的数据 String decryptedBody = (String) request.getAttribute("decryptedBody"); if (decryptedBody != null) { log.debug("准备解析解密后的数据: {}", decryptedBody); - return objectMapper.readValue(decryptedBody, parameter.getParameterType()); + + // 使用 constructType 方法保留泛型信息 + JavaType javaType = objectMapper.getTypeFactory().constructType(parameter.getGenericParameterType()); + + // 特殊处理:如果泛型类型是 List 但实际需要 List<具体类型> + // 这可以解决一些边界情况 + return objectMapper.readValue(decryptedBody, javaType); } // 如果没有解密数据,尝试直接解析请求体(非加密模式) try { - return objectMapper.readValue(request.getInputStream(), parameter.getParameterType()); + // 读取请求体 + StringBuilder sb = new StringBuilder(); + BufferedReader reader = request.getReader(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + String requestBody = sb.toString(); + + if (!requestBody.isEmpty()) { + JavaType javaType = objectMapper.getTypeFactory().constructType(parameter.getGenericParameterType()); + return objectMapper.readValue(requestBody, javaType); + } + + log.warn("请求体为空,无法解析为 {}", parameter.getGenericParameterType()); + return null; } catch (Exception e) { - log.warn("无法解析请求体为 {},返回null", parameter.getParameterType().getSimpleName()); + log.warn("无法解析请求体为 {},错误: {}", parameter.getGenericParameterType(), e.getMessage()); return null; } }