Browse Source

加密注解保留泛型信息

master
liwenxuan 1 month ago
parent
commit
e2d07f57ed
  1. 31
      src/main/java/com/hxgk/lowcode/utils/sm4/DecryptedArgumentResolver.java

31
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<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;
}
}

Loading…
Cancel
Save