解决Hmily与Feign冲突报错 NullPointerException的问题

解决Hmily与Feign冲突报错NullPointerException的问题的完整攻略如下:

  1. 引入Hmily和Feign的依赖

在使用Hmily和Feign时需要引入它们的依赖,比如在Maven中可以使用以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>hmily-spring-cloud-starter</artifactId>
    <version>${hmily.version}</version>
</dependency>

其中${hmily.version}为需要使用的Hmily版本号。

  1. 报错信息

当使用Hmily和Feign时可能会出现冲突,导致出现NullPointerException报错信息,如下所示:

java.lang.NullPointerException: null
    at org.dromara.hmily.core.utils.HolderUtils.clear() ~[hmily-core-2.0.6.jar:2.0.6]
    at org.dromara.hmily.spring.interceptor.HmilyFeignInterceptor.remove() ~[hmily-spring-2.0.6.jar:2.0.6]
    at org.dromara.hmily.spring.interceptor.HmilyFeignInterceptor.intercept(HmilyFeignInterceptor.java:47) ~[hmily-spring-2.0.6.jar:2.0.6]

通过报错信息可以知道,出现了一个NullPointerException,而出现异常的地方是在org.dromara.hmilyorg.springframework.cloud.openfeign这两个包中。

  1. 解决方案

解决这个问题的方法比较简单,只需要将Hmily的Feign拦截器换成自定义的拦截器即可。具体步骤如下:

首先,在使用Hmily时需要在配置文件中配置相关参数,比如以下配置:

spring:
  application:
    name: demo
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
    sentinel:
      transport:
        dashboard: localhost:8080
    feign:
      hystrix:
        enabled: true
      client:
        config:
          default:
            connectTimeout: 5000
            readTimeout: 10000
            # 此处将Hmily的拦截器类名配置为自定义的拦截器
            requestInterceptors: com.example.feign.MyFeignInterceptor

可以看到,此处将requestInterceptors配置项的值修改为自定义的MyFeignInterceptor拦截器类名。

然后,在自定义的MyFeignInterceptor中实现RequestInterceptor接口,并重写apply方法,示例代码如下:

import feign.RequestInterceptor;
import feign.RequestTemplate;

public class MyFeignInterceptor implements RequestInterceptor {

    // 在apply方法中可以对请求进行处理
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 可以在这里添加自定义的处理逻辑
        requestTemplate.header("Custom-Header", "Custom-Value");
    }

}

可以看到,这个自定义拦截器类非常简单,只是在请求模板中添加了一个自定义的header,实际使用中可以根据自己的需求来编写处理逻辑。

最后,重新运行程序,就会发现Hmily和Feign可以正常工作了,不再出现NullPointerException的问题。

  1. 示例说明

以下是两个使用示例说明:

(1)使用Spring Cloud Alibaba官方提供的seata-spring-boot-starter依赖中的SeataAutoConfiguration

在使用seata-spring-boot-starter依赖中的SeataAutoConfiguration类时,需要使用io.seata.spring.annotation.GlobalTransactionScanner注解将这个类标注为bean,示例代码如下:

import io.seata.spring.annotation.GlobalTransactionScanner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SeataConfig {

    @Bean
    public GlobalTransactionScanner globalTransactionScanner() {
        return new GlobalTransactionScanner("my_tx_group", "my_app_name");
    }

}

可以看到,这个全局事务扫描器需要指定一个事务分组和应用名称,然后将其返回作为bean。

如果此时引入了Hmily和Feign的依赖,并进行了相关的配置,那么就可能会出现上述的NullPointerException的问题。

解决这个问题只需要将使用io.seata.spring.annotation.GlobalTransactionScanner的注解从@Bean改成@Component即可,示例代码如下:

import io.seata.spring.annotation.GlobalTransactionScanner;
import org.springframework.stereotype.Component;

@Component
public class GlobalTransactionScannerComponent extends GlobalTransactionScanner {

    public GlobalTransactionScannerComponent() {
        super("my_tx_group", "my_app_name");
    }

}

可以看到,在这个示例中,我们将GlobalTransactionScanner扩展出一个自定义的组件,并在GlobalTransactionScanner的构造函数中传入分组和应用名称。

然后,在这个自定义组件中将自己的类标注为@Component,并将父类的构造函数调用放到构造函数中,从而将它作为bean交由Spring容器管理。

这样,就可以最大限度地兼容Seata和Hmily,并且不会出现NullPointerException的问题。

(2)在通过Feign调用Hmily接口时出现NullPointerException的问题

在通过Feign调用Hmily接口时,如果出现了NullPointerException的问题,可以按照上述步骤将Hmily的Feign拦截器换成自定义的拦截器,从而解决问题。具体的实现可以参考上述的解决方案中的示例代码。

可以看到,这个自定义的拦截器非常简单,只是在请求模板中添加了一个自定义的header,实际使用中可以根据自己的需求来编写处理逻辑。

然后,在application.yml中将拦截器类名配置为自定义的拦截器即可,具体的实现可以参考上述的解决方案中的application.yml配置代码。

这样,就可以使用Feign调用Hmily接口,并且不会出现NullPointerException的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决Hmily与Feign冲突报错 NullPointerException的问题 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java String创建对象实例解析

    下面我来详细讲解“Java String创建对象实例解析”的完整攻略。 什么是Java String对象 Java中的字符串是一个对象,被封装在Java.lang.String类中。其中包含了很多有用的方法,可供开发者使用。 在Java中创建一个字符串可以有多种方式。创建字符串对象可以通过使用两种不同的方式,即字符串文字或字符串构造函数。 使用字符串文字创建…

    Java 2023年5月26日
    00
  • Java多线程实现快速切分文件的程序

    下面我将为你详细讲解“Java多线程实现快速切分文件的程序”的完整攻略。 1. 程序总体思路 本程序的主要任务是将大文件切分成若干个小文件,以便后续进行处理。我们可以采用多线程的方式来实现快速切分文件的功能,具体步骤如下: 读取需要进行切分的大文件,获取文件总长度。 根据线程数量计算每个线程需要读取的文件块大小及起始位置。 创建多个线程,每个线程负责读取指定…

    Java 2023年5月18日
    00
  • Spring Data JPA注解Entity使用示例详解

    Spring Data JPA注解Entity使用示例详解 简介 Spring Data JPA为基于JPA编程提供了一种简单的方法。此模块的主要目标是使基于Spring的应用程序更容易使用JPA,并使使用JPA与Spring的整合更平滑。在这篇文章中,我们将会介绍Spring Data JPA注解Entity的使用方法。 Entity概述 @Entity注…

    Java 2023年5月20日
    00
  • centos7安装mysql并jdbc测试教程

    下面我就为您讲解“CentOS 7安装MySQL并JDBC测试教程”的完整攻略。 安装MySQL 首先,在CentOS 7上安装MySQL需要使用yum包管理器。 步骤1:添加MySQL Yum Repository MySQL官方提供了MySQL Yum Repository来帮助我们更简便地安装MySQL。 使用下面的命令添加官方仓库: sudo rpm…

    Java 2023年6月16日
    00
  • Java定时器Timer使用方法详解

    Java定时器Timer使用方法详解 在Java中,有时需要在程序中计划执行某些任务,或者需要按照一定的时间间隔来执行任务。在这种情况下,我们可以使用Java的定时器——Timer。 Timer概述 Java中的定时器类是java.util.Timer,它允许您在某个时间后执行某个任务,或者在某个时间间隔后重复执行某个任务。它是线程安全的,因此您可以同时计划…

    Java 2023年5月20日
    00
  • JSP 前端数据本地排序实例代码

    当我们需要对表格数据进行排序时,我们可以使用前端的JavaScript进行排序。下面是一个使用JSP和JavaScript实现前端数据本地排序的示例代码: 首先,我们可以创建一个包含表格的HTML代码,表格中的每行数据都由一个对象构成。对象中的每个属性对应每一列的数据,例如姓名、身高、年龄等。 <table id="myTable"…

    Java 2023年6月15日
    00
  • IntelliJ IDEA编译项目报错 “xxx包不存在” 或 “找不到符号”

    下面是 Intellj IDEA 编译项目报错 “xxx包不存在” 或 “找不到符号” 的完整攻略: 1. 确认依赖包已存在 首先,这种报错通常是因为项目所依赖的某个包没有被正确引入或者被 IntelliJ IDEA 项目正确识别,所以我们需要确认所依赖的包已经存在且被正确引入。这个可以通过以下步骤来进行检查: 确认依赖项列表中是否存在该包。可以在 Inte…

    Java 2023年5月26日
    00
  • java多线程数据分页处理实例讲解

    Java多线程数据分页处理实例讲解 背景 在实际应用中,我们经常需要处理大量的数据,通常采用分页的方式进行处理,即每次只处理一页的数据,这样可以避免一次性加载大量数据造成内存溢出的问题。但是,当数据量较大时,单线程处理可能会比较缓慢,这时我们可以运用多线程进行加速处理。 分页算法 一般来说,分页算法的实现思路如下: 1. 根据总记录数和每页记录数计算总页数。…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部