springboot openfeign 获取对象抛异常 unsupportedoperationexception之解决

本文介绍了在使用OpenFeign调用接口时遇到的响应实体转换异常问题,通过在响应实体中增加泛型定义来解决。提供了一个自定义的Result类示例,详细展示了如何正确处理数据转换,确保在调用接口时能够顺利获取并转换为指定对象。此外,还给出了Controller和FeignClient接口的定义,以及实际调用代码示例,强调了使用实体类而不是HashMap的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题: 通过openfeign调用的接口, 响应的实体里面取出来的包装的data对象, 不能转换为指定对象, 抛异常unsupportedoperationexception 报错linkedmap不能转换为xxxxx

解决:响应实体, 增加泛型定义

不多说,上代码。

/**
 * 操作消息结构定义
 *
 * @author zengyujie
 */
@Getter
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    public static String SUCCESS_CODE = "1";
    public static String FAIL_CODE="500";
    private String code;
    private String msg;
    private T data;

    /**
     * 初始化一个新创建的  Result 对象,使其表示一个空消息。
     */
    public Result() {
    }

    /**
     * 初始化一个新创建的  Result 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public Result(String code, String msg) {
        this.code=code;
        this.msg=msg;
    }

    /**
     * 初始化一个新创建的  Result 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public Result(String code, String msg, T data) {
        this.code=code;
        this.msg=msg;
        if (!Objects.isNull(data)) {
            this.data=data;
        }
    }



    public Result<T> setCode(String code) {
        this.code = code;
        return  this;
    }

    public Result<T> setData(T data) {
        this.data = data;
        return  this;
    }

    public Result<T> setMsg(String msg) {
        this.msg = msg;
        return  this;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Result<T>  success() {
        return new Result<>(SUCCESS_CODE,"操作成功");
    }
    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Result<T> success(T t) {
        return new Result<>(SUCCESS_CODE,"操作成功",t);
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static  <T> Result<T>  success(String msg) {
        return new Result<>(SUCCESS_CODE,msg);
    }


    /**
     * 返回错误消息
     *
     * @return
     */
    public static <T> Result<T>  error() {
        return Result.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static <T> Result<T>  error(String msg) {
        return Result.error(FAIL_CODE, msg);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static <T> Result<T>  error(String msg, T data) {
        return new Result<>(FAIL_CODE, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static <T> Result<T>  error(String code, String msg) {
        return new Result<>(code, msg, null);
    }
}

通常, 我们用得最多的是:

 /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static <T> Result<T> success(T t) {
        return new Result<>(SUCCESS_CODE,"操作成功",t);
    }

对应controller的定义:

/**
 * 分页查询
 *
 * @param ckCommQuery 筛选条件
 * @param pageIndex 页面索引
 * @param pageSize 页面条数
 * @return 查询结果
 */
@ApiOperation("分页查询")
@RequestMapping("/list-page")
public Result<PageUtils<CkCommPushdw>> listPage(@RequestBody CkCommPushdw ckCommPushdw, @RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize){
    return Result.success(ckCommPushdwService.queryPage( ckCommPushdw,pageIndex,pageSize));
}

对应的@FeignClient接口定义:

  /**
     * 分页查询
     *
     * @param CkCommPushdw 筛选条件
     * @param pageIndex 页面索引
     * @param pageSize 页面条数
     * @return 查询结果
     */
    @RequestMapping("xxxxxx/list-page")
    Result<PageUtils<CkCommPushdw>> listPage(@RequestBody CkCommPushdw ckCommPushdw,   @RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize);

那么, 这样的话,我们在调用listPage这个函数的时候,渠道的result里面就可以愉快的直接用啦。

有的小伙伴们可能疑惑这个Result为什么跟其他开源框架的不一样,直接继承HashMap不好么? map是方便, 但是, 想过接口代码变更的时候漏改会是什么后果么? 直接用实体类的话,编译的时候是不是就能提前发现了呢 ?

上调用的代码:

public void getCommQueryResult(String dataDate){
         CkCommPushdw ckCommPushdw = new CkCommPushdw();
         ckCommPushdw.setState("2");
         ckCommPushdw.setDataDate(dataDate);

		 //1. 看这里 调用了 ckCommClient 定义的 CkCommPushdw 的 listPage
         Result<PageUtils<CkCommPushdw>> result = ckCommClient.listPage(ckCommPushdw,1,500);
         if (Result.SUCCESS_CODE.equals(result.getCode() )){
             //2. 看这里  如果查到数据
             PageUtils<CkCommPushdw> pageUtils = result.getData();
			 //3. 看这里
             List<CkCommPushdw> ckCommPushdws = pageUtils.getList();
             //如果响应有记录
             boolean updateResult = false;
             if (ckCommPushdws.size()>=1){
                 //根据数据日期进行更新
                 updateResult = jwCxService.update(Wrappers
                         .<JwCx>update()
                         .lambda()
                         .set(JwCx::getState,"2")
                         //where date_date = ckCommPushdw.getDataDate() and state='1'
                         .eq(JwCx::getDataDate,ckCommPushdw.getDataDate())
                         .eq(JwCx::getState,"1")
                 );
                 log.("数据更新完成,更新结果为 {}", updateResult );
             }else {
                 log.info("没查到有 {} 日期已完成的记录",ckCommPushdw.getDataDate());
             }

         }else {
             log.info("额, 调用远程服务没反馈 {}", JSON.toJSONString(result));
         }
    }
### Spring Boot 整合 MyBatis Plus 出现 `UnsupportedOperationException` 的解决方案 当在使用 Spring Boot 集成 MyBatis Plus 时遇到 `java.lang.UnsupportedOperationException` 异常,通常是因为某些方法被调用但未提供具体实现。这种设计模式常见于抽象类或接口中的默认行为定义[^1]。 对于此类异常的具体处理方式如下: #### 方法重载与自定义逻辑实现 如果应用程序尝试执行某个操作而该操作并未实际实现,则会触发此异常。因此建议开发者针对特定业务需求覆盖相应的方法并加入具体的业务逻辑。例如,在继承基类或实现接口时应确保所有必需的功能均已适当编码。 ```java public class CustomBaseMapper<T> extends BaseMapper<T> { @Override public void unsupportedMethod() { // 假设这是引发异常的方法名 // 提供自己的实现而不是异常 System.out.println("Custom implementation of the method."); } } ``` #### 数据源配置调整 有时问题可能源于数据源设置不当。确认应用上下文中只有一个活动的数据源 Bean 或者正确指定了主次数据源。此外还需注意版本兼容性以及第三方组件(如 Sharding-JDBC)集成过程中可能导致的影响[^2]。 #### 日志排查 启用详细的日志记录有助于定位错误根源。通过分析堆栈跟踪信息可以更精准地找到哪个部分的操作未能得到预期的支持从而导致了异常的发生。 ```properties logging.level.com.baomidou.mybatisplus=DEBUG ``` #### 更新依赖项至最新稳定版 保持所使用的框架及其扩展处于最新的稳定状态能够有效减少因已知缺陷引起的运行时错误。定期检查官方文档获取升级指南,并按照指示更新项目内的相关依赖。 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${latest.stable.version}</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值