RestTemplate实现远程调用并解决 java.util.LinkedHashMap cannot be cast to

基本简介

参考过的资料:

案例的介绍:

  • SpringBoot版本:2.3.9.RELEASE
  • Maven 3.6.1
  • jdk 1.8
  • mysql 8 社区
  • 使用到的坐标:
    • myBatis-plus 3.4
    • fastJson 1.2
    • spring-boot-starter-web
  • 案例要实现的功能:根据对应文章表保存的用户id查询出该用户信息
  • 案例包含两个微服务模块:文章和用户
  • 数据库设计:文章数据库和用户数据库开发,
    文章表
    用户表
  • 在案例之前 userAuth = null,案例后userAuth结果如下:
    {
      "flag": true,
      "code": 20000,
      "message": "操作成功",
      "data": {
      	"id": 1,
      	"userId": 1,
      	"categoryId": null,
      	"articleCover": null,
      	"articleTitle": "人工标题1",
      	"articleContent": "人工内容",
      	"type": 1,
      	"originalUrl": null,
      	"isTop": 0,
      	"isDelete": 0,
      	"status": 1,
      	"createTime": "2022-04-12T16:55:22",
      	"updateTime": null,
      	"userAuth": {
      		"id": 1,
      		"userInfoId": 1,
      		"username": "shisan@163.com",
      		"password": "$2a$10$jVUy2pE0JcEnx/owx1LZwe9A0y4ZWIcX3ZsieLFUvoLgP9JaJRAnu",
      		"loginType": 1,
      		"ipAddress": "127.0.0.1",
      		"ipSource": "",
      		"createTime": "2021-08-12T15:43:18",
      		"updateTime": "2022-04-11T23:42:55",
      		"lastLoginTime": "2022-04-11T23:42:55"
      	}
      }
    }
    
  • service层实现类代码
    package com.cduy.blog.service.impl;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.cduy.blog.dao.ArticleDao;
    import com.cduy.blog.domain.Article;
    import com.cduy.blog.domain.UserAuth;
    import com.cduy.blog.service.ArticleService;
    import com.cduy.blog.vo.Result;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author CDUY
     * @version 1.0
     */
    @Service
    public class ArticleServiceImpl extends ServiceImpl<ArticleDao, Article> implements ArticleService {
    
        @Autowired
        private ArticleService articleService;
    
        @Autowired
        private RestTemplate restTemplate;
    
        public Article queryArticleById(Integer articleId) {
            //1.查询文章
            Article article = articleService.getById(articleId);
            //2.远程查询user
            //2.1url地址
            String url = "http://localhost:81/users/" + article.getUserId();
            //2.2发起调用 因为返回结果被封装成了 Result
            Result<UserAuth> result = restTemplate.getForObject(url, Result.class);
            // 因为返回的数据是 Result 需要处理数据
            String jsonObject = JSON.toJSONString(result.getData());
            UserAuth userAuth = JSON.parseObject(jsonObject, UserAuth.class);
            //3.存入article
            article.setUserAuth(userAuth);
            //4.返回
            return article;
        }
    }
    
  • 在黑马教程中,返回的数据没有封装,所以在得到的用户数据可以直接赋值了article.setUserAuth(userAuth);,但这里需要对Json处理
  • 分布式结构中的微服务最近很是火热,在学习过程中遇到错误java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.cduy.blog.domain.UserAuth,该错误是发生在用article.setUserAuth(userAuth);,因为在数据返回时将结果统一封装成Result类,所以不可以简单将Result.getData便取出该用户数据了,而是应该先转成json对象再转换成java对象。

完整代码

22年4月13日第一次提交的分支

posted on 2022-04-13 11:47  stuMartin  阅读(1044)  评论(0编辑  收藏  举报

导航