LinkedHashMap 不能强转为自定义的对象的解决方案

1.背景

微服务开发,广告模块给频道模块提供服务,传递的数据类型为DataVO,DataVO:(使用了Lombok)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataVO implements Serializable {

    private static final long serialVersionUID = -4994882890056393521L;

    public static final int SUCCESS = 1; // 响应成功
    public static final int ERROR = 0;   // 响应失败

    private String token;  // token
    private Integer state; // 响应的状态
    private String msg;    // 对state字段的文本描述
    private Object data;   // 传输的数据

}

在频道模块收到的DataVO中的data属性是不能强转为具体的类型的,如果强转会报以下错误:

[dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX] with root cause

错误信息指出:LinkedHashMap 不能强转为自定义的XXX数据类型。原因是DataVO中的data数据已经变成了LinkedHashMap 类型的数据了。

不能强转,但是可以用以下三种方法转类型。

2.解决方案

2.1使用ObjectMapper转换

@RequestMapping("/main")
    public String toIndex(Model model, ObjectMapper objectMapper){

        System.out.println("查询首页!");

        DataVO dataVO = channelAdvertisementService.getByPosition(1);
        Object data = dataVO.getData();

        List advertisementVOS = objectMapper.convertValue(data, new TypeReference>() {});
        System.out.println("转成了!");
        for (AdvertisementVO advertisementVO : advertisementVOS) {
            System.out.println(advertisementVO);
        }

        //存储数据到域中
        return "index";
    }

2.2使用fastjson转换(需要导入fastjson的依赖)

@RequestMapping(value = "list")
    public Object userList(UserVO userVO, Model model){

        DataVO result = backendUserService.getList(userVO);
        List data = (List)result.getData();
        data = JSON.parseArray(JSON.toJSONString(data),UserVO.class);
        model.addAttribute("userList",data);
        return "userlist";
    }

2.3先强转为list,但对其中的数据不要操作,直接存储到域中,然后在模板中使用map获取值

后台处理:

/**
     * 先强转为list,但对其中的数据不要操作,直接存储到域中
     * @param model
     * @return
     */
    @RequestMapping("/main")
    public String toIndex(Model model){

        DataVO dataVO = channelAdvertisementService.getByPosition(1);
        List adlist = (List)dataVO.getData();
        AdvertisementVO advertisementVO = adlist.get(0);
        System.out.println(advertisementVO);
        int size = adlist.size();
        System.out.println("size:" + size);

        model.addAttribute("adlist",adlist);
        return "index";
    }

前端Thymeleaf取值的时候,不是按照advertisementVO的属性取值,而是把每个对象看成map对象,属性为key,属性值为value。例如此处的advertisementVO中有adfile这个属性,此时不能使用th:src="${advo.adfile}"获取值,而应该如下取值:

 

你可能感兴趣的:(Java笔记)