我正在使用Amazon SimpleDB,并尝试使用以下教程创建一个DB。基本上它会抛出一个错误,即发生错误:java.lang.String不能被强制转换为org.apache.http.HttpHost。完整的堆栈跟踪如下:
发生错误:java.lang.String不能强制转换为org.apache.http.HttpHostjava.lang.ClassCastException: java.lang.String不能被强制转换为org.apache.http.HttpHostorg.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java: 416)org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java: 906)org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java: 805)org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java: 784)com.xerox.amazonws.common.AWSQueryConnection.makeRequest (AWSQueryConnection.java: 474)com.xerox.amazonws.sdb.SimpleDB.makeRequestInt (SimpleDB.java: 231)com.xerox.amazonws.sdb.SimpleDB.createDomain (SimpleDB.java: 155)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();
}
}
关于上述错误发生的原因有什么想法吗?
感谢您的帮助。
似乎你正在使用Typica客户端库,这是自2011年中期以来几乎没有维护过的,例如看到罕见的提交和稳定增长的未解决的问题,其中最新的一个似乎正是你的事实,参见ClassCastException使用Apache HttpClient 4.2:
- 根据记者的说法,一旦我们降级到Apache HttpClient 4.1,事情似乎是正常的,所以这可能是一个临时的解决方案。
无论哪种方式,我都强烈建议切换到官方的AWS Java SDK(或其他语言SDK之一),它不仅以常规方式支持和维护,而且还密切跟踪所有AWS API的变化(诚然,这对Amazon SimpleDB来说并不是那么重要,它基本上是冻结的技术,但使用大量的AWS产品会更容易。
- 此外,如果您正在使用该IDE,您可以从AWS Toolkit for Eclipse中受益。
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) {
// ...
}
请尝试与服务器和端口创建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
}