|
|
|
@ -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<LinkedHashMap> 但实际需要 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; |
|
|
|
} |
|
|
|
} |
|
|
|
|