在 Azure 上列出 SQL 个服务器实例

Listing SQL Server Instances on Azure

我正在尝试实现使用 Azure Java SDK 在我的 Azure 订阅上列出 SQL 服务器实例 运行 的代码。

我按照发布的示例编写了以下代码:

Azure azure  = Azure.authenticate(credentials)).withDefaultSubscription();
SqlServers sqlServers = azure.sqlServers();
PagedList<SqlServer> list = sqlServers.list();

但最后一行抛出一个 java.lang.NoSuchMethodError 和以下堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.type.TypeBindings.create(Ljava/lang/Class;[Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/type/TypeBindings;
at com.microsoft.rest.serializer.JacksonAdapter.constructJavaType(JacksonAdapter.java:119)
at com.microsoft.rest.serializer.JacksonAdapter.deserialize(JacksonAdapter.java:131)
at com.microsoft.rest.ServiceResponseBuilder.buildBody(ServiceResponseBuilder.java:216)
at com.microsoft.rest.ServiceResponseBuilder.build(ServiceResponseBuilder.java:110)
at com.microsoft.azure.AzureResponseBuilder.build(AzureResponseBuilder.java:56)
at com.microsoft.azure.management.sql.implementation.ServersInner.listDelegate(ServersInner.java:553)
at com.microsoft.azure.management.sql.implementation.ServersInner.access0(ServersInner.java:42)
at com.microsoft.azure.management.sql.implementation.ServersInner.call(ServersInner.java:539)
at com.microsoft.azure.management.sql.implementation.ServersInner.call(ServersInner.java:535)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:69)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:173)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.Observable.unsafeSubscribe(Observable.java:10142)
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.subscribe(Observable.java:10238)
at rx.Observable.subscribe(Observable.java:10205)
at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:444)
at rx.observables.BlockingObservable.single(BlockingObservable.java:341)
at com.microsoft.azure.management.sql.implementation.ServersInner.list(ServersInner.java:488)
at com.microsoft.azure.management.resources.fluentcore.arm.collection.implementation.TopLevelModifiableResourcesImpl.list(TopLevelModifiableResourcesImpl.java:116)
at AzureDiscoveryClient.main(AzureDiscoveryClient.java:19)

这显然是一个缺陷,因为 SDK 允许这样做,如果出现问题,应该 return 一个合理的错误代码。

不过,还有其他方法可以在我的 Azure 订阅中列出 SQL 服务器实例 运行 吗?或者也许我在我的代码中做了什么?

我不确定您是否正在寻找 powershell cmdlet 解决方案。但是这个 Powershell cmdlet 应该列出您订阅中的所有 sql 服务器实例。

假设在 运行 这个 powershell cmdlet 之前,您已经在 powershell 中登录到您的 azure 帐户,如果您有多个订阅映射到您的帐户,则在当前 powershell 会话中设置当前订阅。

PS C:\azure> 获取 azurerm 资源组 |获取 azurermsql服务器
资源组名称:DbRG
服务器名称:testSqlserver
地点 : 美国东部
SqlAdministratorLogin : XXXX
SqlAdministratorPassword : XXX
服务器版本:12.0
标签 :

请参考我的工作代码如下:

import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.PagedList;
import com.microsoft.azure.credentials.ApplicationTokenCredentials;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.sql.SqlServer;
import com.microsoft.azure.management.sql.SqlServers;

import java.io.IOException;

public class ListSqlInstance {

    public static void main(String[] args) throws IOException {


        ApplicationTokenCredentials credentials = new ApplicationTokenCredentials(
                "{client Id}",
                "{talent Id}",
                "{secret}",
                AzureEnvironment.AZURE);
        Azure.Authenticated azureAuth = Azure.authenticate(credentials);
       Azure azure = azureAuth.withDefaultSubscription();

        SqlServers sqlServers = azure.sqlServers();
        PagedList<SqlServer> list = sqlServers.list();
        System.out.println(list.size());
    }
}

我的sdk版本:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure</artifactId>
    version>1.12.0</version>
</dependency>

不要忘记向您的客户端授予访问 sql 服务器权限。

希望对你有帮助。

问题已解决!

错误来自 Azure SDK 与 jackson-databind 库之间的不兼容。 这个库使用的方法之一是相对较新的,我在我的项目中的版本(只有一个导入的干净项目 - Azure SDK)没有这个方法。

导入最新的jackson-databind如下:

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.5</version>
</dependency>

已解决问题。

感谢大家的帮助。