带有 Java SDK 的通用 Aws 客户端构建器

Generic Aws client builder with Java SDK

我正在做一个项目,现在我们有一个请求,要求为所有实例(Ec2、S3 等)提供使 coll 成为代理服务器的选项。 例如,我有:

AmazonElasticLoadBalancing elbClient = AmazonElasticLoadBalancingClientBuilder.standard()       .withRegion(region.getName()).withCredentials(credentials).build();

AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard().withRegion(region).withCredentials(getCredentials()).build();

在我项目的很多地方。

检查 AWS Java SDK 文档后,我发现在使用 build().

之前我需要添加 withClientConfiguration(someMethodToGetProxyConfig())

我对 java 还是有点陌生​​,我很难创建一个足够通用的函数来为所有这些类型的客户执行此操作。 我试过:

public static AwsClientBuilder clientBuilder(AwsClientBuilder client) throws ServiceWareException {
        final String PROXY = "proxy_host_port";
        String hasProxy = Configuration.getConfigurationParameter(PROXY);
        client = client.withRegion(getRegion()).withCredentials(getCredentials());
        if (!hasProxy.isEmpty() && hasProxy != null)
            client = client.withClientConfiguration(getProxyConfig());
        return (AwsClientBuilder) client.build();

    }

但它失败了,因为我无法将 AmazonEC2ClientBuilder 转换为 AwsClientBuilder。 有人可以分享一些关于如何做的技巧或者可能有做类似事情的经验吗?

在你的最后一行中,你正在调用 .build(),它 return 是客户端而不是客户端 builder。如果您删除对 .build() 的调用,那么我想代码会起作用。

public static AwsClientBuilder clientBuilder(AwsClientBuilder client) throws ServiceWareException {
    final String PROXY = "proxy_host_port";
    String hasProxy = Configuration.getConfigurationParameter(PROXY);
    client = client.withRegion(getRegion()).withCredentials(getCredentials());
    if (!hasProxy.isEmpty() && hasProxy != null)
        client = client.withClientConfiguration(getProxyConfig());
    return client;
}

如果你想使用它,你需要在结果上调用 .build。为了很好地进行类型检查,您可能还想将泛型类型参数添加到签名中(因此 .build return 是正确类型的值)。

public static <S extends AwsClientBuilder<S, T>, T> AwsClientBuilder<S, T> clientBuilder(AwsClientBuilder<S, T> client) throws ServiceWareException {
    ...
}

如果您希望此方法实际构建客户端,您可以在方法内调用 .build,但它需要 return 客户端,而不是客户端构建器。由于这是不同的行为,我更改了方法的名称以反映这一点。

public static <S extends AwsClientBuilder<S, T>, T> T buildClient(AwsClientBuilder<S, T> client) throws ServiceWareException {
    final String PROXY = "proxy_host_port";
    String hasProxy = Configuration.getConfigurationParameter(PROXY);
    client = client.withRegion(getRegion()).withCredentials(getCredentials());
    if (!hasProxy.isEmpty() && hasProxy != null)
        client = client.withClientConfiguration(getProxyConfig());
    return client.build();
}