Java - 在Amazon SimpleDB中创建域名

3

我正在使用Amazon SimpleDB并尝试按照以下教程创建一个数据库。但实际上,它抛出了一个错误,即“错误发生:java.lang.String无法转换为org.apache.http.HttpHost”。完整的堆栈跟踪如下所示:

错误发生:java.lang.String无法转换为org.apache.http.HttpHost java.lang.ClassCastException: java.lang.String无法转换为org.apache.http.HttpHost at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:416) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) at com.xerox.amazonws.common.AWSQueryConnection.makeRequest(AWSQueryConnection.java:474) at com.xerox.amazonws.sdb.SimpleDB.makeRequestInt(SimpleDB.java:231) at com.xerox.amazonws.sdb.SimpleDB.createDomain(SimpleDB.java:155) at com.amazonsimpledb.SDBexample1.main(SDBexample1.java:19)

我的代码如下(请注意,我已用实际值替换了AWS访问ID和秘密密钥):

public static void main(String[] args) {

     String awsAccessId = "My aws access id";
     String awsSecretKey = "my aws secret key";

     SimpleDB sdb = new SimpleDB(awsAccessId, awsSecretKey, true);

     try {
        Domain domain = sdb.createDomain("cars");

        System.out.println(domain);

    } catch (com.xerox.amazonws.sdb.SDBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

有什么想法是导致上述错误发生的原因吗。

非常感谢任何帮助。

2个回答

7

看起来您正在使用 Typica 客户端库,自2011年中旬以来基本上没有得到维护,例如请查看罕见的提交不断增长的未解决问题,最新的问题似乎实际上就是您的问题,详见使用 Apache HttpClient 4.2 时出现 ClassCastException

  • 根据报告人的说法,一旦我们回退到 Apache HttpClient 4.1,事情似乎就会正常起来,因此这可能是一个临时的解决方法。
无论如何,我强烈建议切换到官方的 AWS SDK for Java(或其他语言的SDK之一),这不仅得到定期支持和维护,而且还密切跟踪所有AWS API更改(诚然,对于技术基础基本上被冻结的Amazon SimpleDB来说,这并不是那么关键,但您将更轻松地使用以后的AWS产品和服务)。

该SDK包括一些示例(也可通过Eclipse Toolkit向导获取),其中之一是SimpleDB - 这里是有关您的示例的简化代码摘录:

BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(
    awsAccessId, awsSecretKey);
AmazonSimpleDB sdb = new AmazonSimpleDBClient(basicAWSCredentials);
Region usWest2 = Region.getRegion(Regions.US_WEST_2);
sdb.setRegion(usWest2);

try {
    // Create a domain
    String myDomain = "MyStore";
    System.out.println("Creating domain called " + myDomain + ".\n");
    sdb.createDomain(new CreateDomainRequest(myDomain));

    // ...
    // Delete a domain
    System.out.println("Deleting " + myDomain + " domain.\n");
    sdb.deleteDomain(new DeleteDomainRequest(myDomain));
} catch (AmazonServiceException ase) {
    // ...
} catch (AmazonClientException ace) {
    // ...
}

@AMonari - 如果您尝试给我留言,它似乎已被截断。我已更新我的答案,详细说明了未维护/未解决的上游问题,其中最新的问题实际上似乎与您的问题相同,请参见问题135。我认为这个问题和明显缺乏维护者回应几乎确认了我想要表达的观点,即您不能再期望在这个库中获得任何修复,需要自己动手解决——但是为什么要这样做呢?因为已经有更好的替代品存在了。 - Steffen Opel

0
请尝试使用服务器和端口创建SimpleDB实例,并告诉我它是否有效。
public SimpleDB objSimpleDB = null;
private String awsAccessKeyId = "access key";
private String awsSecretAccessKey = "secret key";
private boolean isSecure= true;
private String server = "sdb.amazonaws.com";
private int port=443;

try{
SimpleDB objSimpleDB = new SimpleDB(awsAccessKeyId, awsSecretAccessKey, isSecure, server, port);
Domain domain = objSimpleDB .createDomain("cars");
} catch (com.xerox.amazonws.sdb.SDBException e) {
      //handle error
}

嗨,Ashish,感谢您的帮助。我尝试了您上面的建议,但仍然遇到相同的错误,即“Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.http.HttpHost”,并且堆栈跟踪也是相同的。有任何想法吗?谢谢。 - TokTok123
1
@AMonari - 我刚刚更新了我的答案,关于明显相同的上游问题[问题135(使用Apache HttpClient 4.2时出现ClassCastException)](http://code.google.com/p/typica/issues/detail?id=135),这似乎表明在使用Apache HttpClient 4.2时引入了不兼容性,而该库仍然可以与HttpClient 4.1一起使用。 - Steffen Opel
@Steffen Opel - 首先非常感谢您的贡献。我曾经离开这个问题,但现在又回来了。我理解您关于更好的官方AWS Java SDK的观点,并将尝试使用它,看看效果如何。 - TokTok123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接