java - Spring Boot Azure 存储客户端产生 java.lang.NoSuchFieldError : NOOP_CONFIGURER

标签 java spring-boot azure gradle azure-storage

我正在尝试创建一个能够访问 Azure 存储的 Spring Boot 应用程序。

以下是我尝试在 build.gradle 中声明的一些依赖项到目前为止...

implementation 'com.azure:azure-storage-blob:+'    // Current Dependency

implementation 'com.azure.spring:azure-spring-boot-starter-storage:+'    // Previous Dependency

两者都可以让我访问 BlobServiceClient我用来访问我的 Azure Blob 容器的类。

在我的application.properties文件,我有以下属性:

#Storage settings

# Current Attempt
azure.connection=${STORAGE_ACCOUNT_CONNECTION}


# Previous Attempt
azure.storage.account-name=${STORAGE_ACCOUNT_NAME}
azure.storage.account-key=${STORAGE_ACCOUNT_KEY}
azure.storage.blob-endpoint=${STORAGE_ACCOUNT_ENDPOINT}

然后,我在名为 StorageService 的 Spring 服务类中使用这些属性。管理BlobServiceClient 。这是我的两次设置尝试:

1(当前)。

    @Autowired
    StorageService(@Value("${azure.connection}") String connection)
    {

        client = new BlobServiceClientBuilder().connectionString(connection).buildClient();
        objectMapper = new ObjectMapper();
    }
  • (上一个)。
  •     @Autowired
        StorageService(@Value("${azure.storage.account-name}") String name,
                       @Value("${azure.storage.account-key}") String key,
                       @Value("${azure.storage.blob-endpoint}") String endpoint)
        {
            AzureNamedKeyCredential credential = new AzureNamedKeyCredential(name, key);
            client = new BlobServiceClientBuilder().credential(credential).endpoint(endpoint).buildClient();
            objectMapper = new ObjectMapper();
        }
    

    我什至尝试使用 Java 11 和 Java 17。但是,每次我设法在 Intelli-J 中运行它时,都会收到此错误。

    Caused by: java.lang.NoSuchFieldError: NOOP_CONFIGURER
    
        at reactor.netty.ChannelPipelineConfigurer.emptyConfigurer(ChannelPipelineConfigurer.java:40)
        at reactor.netty.transport.TransportConfig.<init>(TransportConfig.java:207)
        at reactor.netty.transport.ClientTransportConfig.<init>(ClientTransportConfig.java:164)
        at reactor.netty.http.client.HttpClientConfig.<init>(HttpClientConfig.java:327)
        at reactor.netty.http.client.HttpClientConnect.<init>(HttpClientConnect.java:85)
        at reactor.netty.http.client.HttpClient.create(HttpClient.java:393)
        at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.build(NettyAsyncHttpClientBuilder.java:141)
        at com.azure.core.http.netty.NettyAsyncHttpClientProvider.createInstance(NettyAsyncHttpClientProvider.java:19)
        at com.azure.core.implementation.http.HttpClientProviders.createInstance(HttpClientProviders.java:67)
        at com.azure.core.http.HttpClient.createDefault(HttpClient.java:50)
        at com.azure.core.http.HttpClient.createDefault(HttpClient.java:40)
        at com.azure.core.http.HttpPipelineBuilder.build(HttpPipelineBuilder.java:73)
        at com.azure.storage.blob.implementation.util.BuilderHelper.buildPipeline(BuilderHelper.java:138)
        at com.azure.storage.blob.BlobServiceClientBuilder.buildAsyncClient(BlobServiceClientBuilder.java:135)
        at com.azure.storage.blob.BlobServiceClientBuilder.buildClient(BlobServiceClientBuilder.java:114)
        at com.trecapps.users.services.StorageService.<init>(StorageService.java:40)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)
        ... 49 common frames omitted
    

    当我用谷歌搜索"NOOP_CONFIGURER"时(带引号),我得到 2 个结果,因此这个错误似乎没有得到很好的记录。关于如何启动我的应用程序有什么建议吗?

    最佳答案

    请检查以下几点。

    • NoSuchField,通常表示链接目标类时,该字段 不在这里。但是编译时,类应该有那个字段, 否则代码无法编译。

    i.e; it indicates that an application tries to access or modify an object’s field, but that field no longer exists.

    • 如果类的定义在运行时可能会发生此错误 已发生不兼容的更改。
    1. 如图所示的异常发生在ChannelPipelineConfigurer处。在返回 NOOP_configurer 的空配置方法中,该方法存在于 reactor.netty 下的 reactor netty core

    2. 这似乎是由于reactor-netty jar 中的版本不匹配造成的

    ChannelPipelineConfigurer.java

    package reactor.netty;
    
    import io.netty.channel.Channel;
    import reactor.util.annotation.Nullable;
    
    import java.net.SocketAddress;
    
    import static reactor.netty.ReactorNetty.CompositeChannelPipelineConfigurer.compositeChannelPipelineConfigurer;
    
    @FunctionalInterface
    public interface ChannelPipelineConfigurer {
        static ChannelPipelineConfigurer emptyConfigurer() {
            return ReactorNetty.NOOP_CONFIGURER;
    }
    

    因此,请检查是否是 Reactor Netty Core 发行版本不兼容造成的,或者是否发生了一个或多个版本冲突,并尝试升级到最新版本的发行 jar,并检查是否存在任何不兼容的依赖项。

    要处理 NoSuchFieldError 错误,请尝试清理所有现有的 .class 文件并从头开始编译所有内容。以便验证每个引用的类是否已编译为其最新版本。

    但是,如果在运行时仍然抛出错误,则可能必须使用库的一个版本进行编译,但在运行时使用另一版本。您必须验证您的类路径是否包含指定库的正确版本。

    关于java - Spring Boot Azure 存储客户端产生 java.lang.NoSuchFieldError : NOOP_CONFIGURER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71994212/

    相关文章:

    java - Spring-Kafka @KafkaHandlers 不消耗各自的 java 对象

    sql - hql 查询以检索具有最大日期值的数据

    azure - az cli 如何设置 webapp 运行时

    c# - 网络API : Download Multiple Files Separately

    java - 在 Android 2.2.2 上忽略耳机

    java - 无法将 EAR 发布到 Websphere

    javascript - 如何在 Spring Boot 中将参数从 Ajax 传递到 RestController

    c# - 通过 Rest Call 查询 Windows Azure Active Directory Graph Api

    java - 获取 View 寻呼机的正确实例

    java - 将逗号分隔的字符串转换为没有中间容器的列表