Spring Boot Azure Storage Client yields java.lang.NoSuchFieldError: NOOP_CONFIGURER

Spring Boot Azure Storage Client yields java.lang.NoSuchFieldError: NOOP_CONFIGURER

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

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

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

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

两者都允许我访问我用来访问我的 Azure Blob 容器的 BlobServiceClient class。

在我的 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 服务 Class 中使用这些属性来管理 BlobServiceClient 。这是我设置它的两次尝试:

1(当前)。

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

        client = new BlobServiceClientBuilder().connectionString(connection).buildClient();
        objectMapper = new ObjectMapper();
    }
  1. (上一个)。
    @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,通常表示链接目标class时,字段 不在这里。但是在编译时, class 应该有那个字段, 否则代码无法编译。

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

  • 如果定义了一个 class,这个错误可能会在运行时发生 发生了不兼容的变化。
  1. 显示的异常发生在 ChannelPipelineConfigurer in empty configure method which returns NOOP_configurer which is present in reactor netty core under the package reactor.netty

  2. 这好像是reactor-nettyjar

    版本不匹配导致的

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 核心发布版本不兼容是否是一个或多个版本冲突发生的原因 & 尝试升级到最新版本的发布 jar 并检查是否存在任何不兼容的依赖项。

到 handle/deal 并出现 NoSuchFieldError 错误,尝试清除所有现有的 .class 文件并编译来自 scratch.so 的所有内容,以验证每个引用的 class 都被编译为它的最新版本。

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

已添加

    implementation "io.projectreactor.netty:reactor-netty-core:+"
    implementation "io.projectreactor.netty:reactor-netty-http:+"

到我的 build.gradle 文件。