使用Azure SDK for Java创建KeyClient时遇服务异常求助
问题
我尝试在代码中创建KeyClient对象,以便在Azure Key Vault中生成密钥,但创建后的对象内部服务始终存在错误,无法执行任何功能。
以下是我的代码:
@Override public void generateProductAuthKeyPair(Long channelId) { try { KeyClient keyClient = new KeyClientBuilder() .vaultUrl(keyVaultUrl) .credential(new DefaultAzureCredentialBuilder().build()) .buildClient(); String keyName = "UseAuthKeyChannel" + channelId.toString(); CreateEcKeyOptions keyOptions = new CreateEcKeyOptions(keyName); keyOptions.setCurveName(KeyCurveName.P_256); KeyVaultKey ecKey = keyClient.createEcKey(new CreateEcKeyOptions(keyName) .setCurveName(KeyCurveName.P_256) .setExpiresOn(OffsetDateTime.now().plusYears(1))); System.out.printf("Key created with name \"%s\" and id %s%n", ecKey.getName(), ecKey.getId()); Channel channel = channelRepository.getChannelById(channelId); } catch (Exception e) { e.printStackTrace(); } }
每次创建KeyClient时,其内部服务都会出现错误(如截图所示),似乎是内部类缺少注解。我使用的是最新版本的Azure SDK,以下是pom.xml中的依赖配置:
<dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-security-keyvault-keys</artifactId> <version>4.7.3</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-core</artifactId> <version>1.45.1</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.11.1</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-kms</artifactId> <version>1.12.621</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>br.com.cittamobi.abt</groupId> <artifactId>models</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.11.4</version> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.javatuples</groupId> <artifactId>javatuples</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.12</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180130</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.50</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>1.5.8.RELEASE</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>com.zenvia</groupId> <artifactId>zenvia-api-sdk-client-spring</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.3.5</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.mashape.unirest</groupId> <artifactId>unirest-java</artifactId> <version>1.4.9</version> </dependency> <dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-storage</artifactId> <version>8.4.0</version> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.6.2</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>4.1.68.Final</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.1</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.10</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>io.github.techgnious</groupId> <artifactId>IVCompressor</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.32</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.9</version> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.6</version> </dependency> </dependencies>
创建的KeyClient无法执行任何功能,调用时服务会抛出异常,请问该如何解决此问题?
解决建议
- 移除azure-core中对jackson-core的排除配置:Azure SDK严重依赖Jackson进行序列化/反序列化,排除jackson-core会导致内部类无法正常处理JSON数据,引发缺少注解类的错误。直接删除azure-core依赖里的exclusions块即可。
- 统一Spring Boot版本依赖:当前pom中混合了不同版本的Spring组件(比如spring-boot-starter-amqp用1.5.8,spring-web用5.2.4),版本不一致会导致类加载冲突,影响Azure SDK的正常工作。建议使用Spring Boot的依赖管理来统一所有Spring相关组件的版本。
- 检查DefaultAzureCredential的配置:确保运行环境中配置了正确的Azure身份认证参数(比如环境变量、Azure CLI登录、托管身份等),DefaultAzureCredential需要这些配置才能正常获取访问Key Vault的权限,否则会导致认证失败,看似是客户端内部错误。
- 替换旧版Azure依赖:当前使用的azure-storage是8.4.0的旧版本,和新版azure-security-keyvault-keys可能存在依赖冲突,建议升级到新版的azure-storage-blob或对应组件,或者移除不需要的旧Azure依赖。
- 简化KeyClient创建代码:代码中重复创建了CreateEcKeyOptions对象,直接复用之前创建的keyOptions并设置过期时间即可,减少不必要的对象创建,避免潜在的初始化问题。修改后的代码片段如下:
CreateEcKeyOptions keyOptions = new CreateEcKeyOptions(keyName); keyOptions.setCurveName(KeyCurveName.P_256); keyOptions.setExpiresOn(OffsetDateTime.now().plusYears(1)); KeyVaultKey ecKey = keyClient.createEcKey(keyOptions);
内容的提问来源于stack exchange,提问作者Lucas Penna
相关产品推荐
相关产品推荐

