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

yizhihongxing

解决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-synchronized 嵌套使用代码详解

    Java synchronized 嵌套使用代码详解 在Java 中使用synchronized 关键字是实现多线程同步的重要手段之一,它可以锁定共享资源,保证线程安全。有时候可能会遇到需要在方法中嵌套使用synchronized 实现更细粒度的同步控制,这里将详细讲解java-synchronized 嵌套使用的代码实现和使用技巧。 synchronize…

    Java 2023年5月26日
    00
  • springMVC框架下JQuery传递并解析Json数据

    下面是详细的攻略: 1. 概述 Spring MVC 是一个常用的 Java Web 开发框架,而 jQuery 是一个非常流行的 JavaScript 库。在前端和后端协作开发的过程中,我们常常需要通过 AJAX 来进行异步数据交互。传递 JSON 数据,并解析 JSON 数据是基于 AJAX 进行异步交互的常见需求之一。本文将详细介绍在 Spring M…

    Java 2023年6月15日
    00
  • SpringBoot深入分析运行原理与功能实现

    SpringBoot深入分析运行原理与功能实现 什么是SpringBoot SpringBoot是一个开源的、轻量级的框架,用于快速构建基于Spring框架的Web应用程序和微服务。相对于传统的Spring框架,它更加简单方便,提供了自动配置、嵌入式Web服务器等特性,使得开发者可以快速构建可靠的、健壮的Web应用程序。 以下是SpringBoot的一些特性…

    Java 2023年5月15日
    00
  • Java如何将处理完异常之后的程序能够从抛出异常的地点向下执行?

    在 Java 中,可以使用异常处理机制来捕获和处理异常,如果在程序执行过程中抛出了异常,那么程序会立即停止执行。为了解决这个问题,Java 提供了异常处理机制,可以通过捕获异常并处理它们,使得程序能够继续执行下去。 当程序运行时发生异常时,程序会跳转到与异常相符的 catch 语句块,并执行该语句块中的代码,处理完异常后可以通过尝试继续执行下一个块语句来使程…

    Java 2023年5月27日
    00
  • fastjson对JSONObject中的指定字段重新赋值的实现

    要对JSONObject中的指定字段重新赋值,可以使用FastJSON提供的API。具体实现过程如下: 首先,我们需要将JSONObject转化为Java对象。可以使用FastJSON提供的parseObject方法,将JSONObject字符串转化成Java对象,并指定Java对象的Class类型。如下所示: String jsonString = &qu…

    Java 2023年5月26日
    00
  • JAVA中的for循环几种使用方法讲解

    JAVA中的for循环几种使用方法讲解 在Java中,for循环是最常用的循环结构之一。它可以重复执行代码块,根据不同的循环条件可以有多种使用方式。 基本的for循环 最基本的for循环有三个部分,分别是循环变量初始化、循环条件和循环变量的更新。语法如下: for (循环变量初始化; 循环条件; 循环变量的更新) { // 循环体代码块 } 其中,循环变量初…

    Java 2023年5月26日
    00
  • boot-admin整合flowable官方editor-app进行BPMN2.0建模

    正所谓百家争鸣、见仁见智、众说纷纭、各有千秋!在工作流bpmn2.0可视化建模工具实现的细分领域,网上扑面而来的是 bpmn.js 这个渲染工具包和web建模器,而笔者却认为使用flowable官方开源 editor-app 才是王道。 Flowable 开源版本中的 web 版流程设计器editor-app,展示风格和功能基本跟 activiti-mode…

    Java 2023年4月22日
    00
  • 详解java如何正确使用volatile

    如何正确使用volatile 什么是volatile 在Java中,volatile是一种非常特殊的关键字。它用来表示一个变量是易变的,即它可能由于线程间的可见性导致不同线程读到不同的值。当我们声明一个变量为volatile时,Java会保证这个变量的内存可见性和线程安全性。 为什么使用volatile 因为当多个线程访问共享状态时,可能会出现一些意料不到的…

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