Mule 4 DataWeave 2调用接收Student POJO列表的Java静态方法报错解决
解决JSON数组转List传入Java方法的问题
问题根源是Java泛型的类型擦除机制:直接反序列化JSON数组时,序列化框架无法识别List<Student>的泛型参数,会默认将每个JSON对象转为LinkedHashMap,导致调用StudentService.mytest时类型不匹配。以下是两种主流序列化库的解决方案:
1. 使用Jackson库
引入依赖(Maven)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 建议使用最新稳定版本 --> </dependency>
反序列化并调用方法
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; // 替换为你的JSON数组字符串 String jsonArrayStr = "[{\"id\":\"1\",\"name\":\"Alice\",\"lastName\":\"Smith\"}, {\"id\":\"2\",\"name\":\"Bob\",\"lastName\":\"Jones\"}]"; ObjectMapper objectMapper = new ObjectMapper(); // 通过TypeReference明确泛型类型,避免转为LinkedHashMap List<Student> studentList = objectMapper.readValue(jsonArrayStr, new TypeReference<List<Student>>() {}); // 调用目标静态方法 Map<String, Student> resultMap = StudentService.mytest(studentList);
2. 使用Gson库
引入依赖(Maven)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 建议使用最新稳定版本 --> </dependency>
反序列化并调用方法
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; // 替换为你的JSON数组字符串 String jsonArrayStr = "[{\"id\":\"1\",\"name\":\"Alice\",\"lastName\":\"Smith\"}, {\"id\":\"2\",\"name\":\"Bob\",\"lastName\":\"Jones\"}]"; Gson gson = new Gson(); // 通过TypeToken获取泛型的Type信息 List<Student> studentList = gson.fromJson(jsonArrayStr, new TypeToken<List<Student>>(){}.getType()); // 调用目标静态方法 Map<String, Student> resultMap = StudentService.mytest(studentList);
关键注意事项
- 确保
Student类的无参构造方法存在(你的代码已满足),序列化框架依赖它创建实例。 - 若JSON键名与
Student属性名不一致,可通过注解映射:- Jackson用
@JsonProperty("json_key_name")标注属性 - Gson用
@SerializedName("json_key_name")标注属性
- Jackson用
- 若在Spring等Web框架中接收请求,可直接在Controller方法参数中声明
@RequestBody List<Student> studentList,框架会自动完成正确的反序列化。
内容的提问来源于stack exchange,提问作者akila
相关产品推荐
相关产品推荐

