一、业务场景
- 最近有新的功能迭代修改的修改之前的代码,,考虑到扩展性就将代码做了如下的修改
public class TopicInfo<T> extends KafkaTypeBase {
/**
* topic的基本的信息
*/
@NotNull(message = "TopicInfo不能为null")
private T topicInfo;
}
但是在写完代码测试的时候得到了如下的报错
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
二、解决方法
- 出现上述问题的原因是:前端传递过来的参数是使用LinkedTreeMap去存储的。不能直接将这个转换为指定的对象。那那解决这个问题的最好的办法就是将传递过来的数据首先转换为JsonString。然后在将这个转换为对应的Bean对象。
- 测试类
public class TestModel<T> extends TypeBase{
private T role;
public T getRole() {
return role;
}
public void setRole(T role) {
this.role = role;
}
}
@RestController
public class TestController {
@PostMapping("test")
public String test(@RequestBody TestModel model){
TypeEnum typeEnum = model.getTypeEnum();
if (typeEnum.equals(TypeEnum.TEACHER)){
String json = JsonUtil.toJson(model.getRole());
Teacher teacher = JsonUtil.fromJson(json, Teacher.class);
return teacher.getName() + ":" +teacher.getAge();
}
return null;
}
}
- 测试数据
{
"typeEnum":"TEACHER",
"role":{
"name":"张三",
"age":"35"
}
}
- 返回结果
张三:35
到此好像可以正常的将数据转换为我们需要的类型。完美的解决了问题。
5. 转换工具类
import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import lombok.Data;
import java.lang.reflect.Type;
/**
* @description:
* @author: zxs
* @date: 2021/05/13/12:06
*/
public class JsonUtil {
private JsonUtil(){}
/**
* 对象转换成json字符串
* @param obj 需要转换的对象
* @return 返回的JsonString
*/
public static String toJson(Object obj) {
Gson gson = new Gson();
return gson.toJson(obj);
}
/**
* json字符串转成对象
* @param jsonString 描述对象的Json
* @param type 目标类型
* @return 转换之后的对象
*/
public static <T> T fromJson(String jsonString, Type type) {
Gson gson = new Gson();
return gson.fromJson(jsonString, type);
}
/**
* json字符串转成对象
* @param jsonString 等待转换的JsongString
* @param type 需要转换的类型
* @return 转换之后对应的Bean
*/
public static <T> T fromJson(String jsonString, Class<T> type) {
Gson gson = new Gson();
return gson.fromJson(jsonString, type);
}}