AWS DynamoDB的Eclipse Spring引导问题



我是第一次试用AWS DynamoDB。我下载了AWS SDK并安装在Eclipse中。我设置了由AWS提供的示例Java DynamoDB"存储和查询"项目。我把它作为一个简单的java应用程序在Eclipse上运行,它执行起来没有任何问题。我创建了一个新的Spring Boot项目,并复制粘贴了应用程序,还添加了必要的Spring Boot参数。Spring Boot版本失败,在main()代码的第一行出现"java.lang.ClassNotFoundException"。在init()中执行AmazoneDynamoDBClientBuilder期间,会出现java.lang.ClassNotFoundException。具体来说,它在init()方法中的AmazonDynamoDBClientBuilder类中失败。代码是干净的,构建时没有错误。我要说的是,我很难从Maven Central中选择合适的罐子。DynamoDB代码对最新的jar版本非常挑剔。

附件是代码清单,

package com.belcan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
import com.amazonaws.services.dynamodbv2.model.Condition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.PutItemResult;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
import com.amazonaws.services.dynamodbv2.model.ScanRequest;
import com.amazonaws.services.dynamodbv2.model.ScanResult;
import com.amazonaws.services.dynamodbv2.model.TableDescription;
import com.amazonaws.services.dynamodbv2.util.TableUtils;
@SpringBootApplication
public class DynamoTest1Application {
/*
* Before running the code:
*      Fill in your AWS access credentials in the provided credentials
*      file template, and be sure to move the file to the default location
*      (C:\Users\Stephen\.aws\credentials) where the sample code will load the
*      credentials from.
*      https://console.aws.amazon.com/iam/home?#security_credential
*
* WARNING:
*      To avoid accidental leakage of your credentials, DO NOT keep
*      the credentials file in your source directory.
*/
static AmazonDynamoDB dynamoDB;
/**
* The only information needed to create a client are security credentials
* consisting of the AWS Access Key ID and Secret Access Key. All other
* configuration, such as the service endpoints, are performed
* automatically. Client parameters, such as proxies, can be specified in an
* optional ClientConfiguration object when constructing a client.
*
* @see com.amazonaws.auth.BasicAWSCredentials
* @see com.amazonaws.auth.ProfilesConfigFile
* @see com.amazonaws.ClientConfiguration
*/
private static void init() throws Exception {
/*
* The ProfileCredentialsProvider will return your [default]
* credential profile by reading from the credentials file located at
* (C:\Users\Stephen\.aws\credentials).
*/
System.out.println("Starting Init()");
ProfileCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
try {
credentialsProvider.getCredentials();
} catch (Exception e) {
throw new AmazonClientException(
"Init()-1: Cannot load the credentials from the credential profiles file. " +
"Please make sure that your credentials file is at the correct " +
"location (C:\Users\Stephen\.aws\credentials), and is in valid format.",
e);
}
System.out.println("Init()-1 Complete");
try {
/****** Fails Right Here!!  Line 86 is ".withCredentials(credentialsProvider)" *****/
dynamoDB = AmazonDynamoDBClientBuilder.standard()
.withCredentials(credentialsProvider)
.build();
} catch (Exception e) {
throw new AmazonClientException(
"Init()-2: Cannot build client", e);
}
System.out.println("Init()-2 Complete");
}
public static void main(String[] args) throws Exception {
SpringApplication.run(DynamoTest1Application.class, args);
/***** This is line 98 ****/
init();
try {
String tableName = "my-favorite-movies-table";
// Create a table with a primary hash key named 'name', which holds a string
CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName)
.withKeySchema(new KeySchemaElement().withAttributeName("name").withKeyType(KeyType.HASH))
.withAttributeDefinitions(new AttributeDefinition().withAttributeName("name").withAttributeType(ScalarAttributeType.S))
.withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L));
// Create table if it does not exist yet
TableUtils.createTableIfNotExists(dynamoDB, createTableRequest);
// wait for the table to move into ACTIVE state
TableUtils.waitUntilActive(dynamoDB, tableName);
// Describe our new table
DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(tableName);
TableDescription tableDescription = dynamoDB.describeTable(describeTableRequest).getTable();
System.out.println("Table Description: " + tableDescription);
// Add an item
Map<String, AttributeValue> item = newItem("Bill & Ted's Excellent Adventure", 1989, "****", "James", "Sara");
PutItemRequest putItemRequest = new PutItemRequest(tableName, item);
PutItemResult putItemResult = dynamoDB.putItem(putItemRequest);
System.out.println("Result: " + putItemResult);
// Add another item
item = newItem("Airplane", 1980, "*****", "James", "Billy Bob");
putItemRequest = new PutItemRequest(tableName, item);
putItemResult = dynamoDB.putItem(putItemRequest);
System.out.println("Result: " + putItemResult);
// Scan items for movies with a year attribute greater than 1985
HashMap<String, Condition> scanFilter = new HashMap<String, Condition>();
Condition condition = new Condition()
.withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(new AttributeValue().withN("1985"));
scanFilter.put("year", condition);
ScanRequest scanRequest = new ScanRequest(tableName).withScanFilter(scanFilter);
ScanResult scanResult = dynamoDB.scan(scanRequest);
System.out.println("Result: " + scanResult);
} catch (AmazonServiceException ase) {
System.out.println("Caught an AmazonServiceException, which means your request made it "
+ "to AWS, but was rejected with an error response for some reason.");
System.out.println("Error Message:    " + ase.getMessage());
System.out.println("HTTP Status Code: " + ase.getStatusCode());
System.out.println("AWS Error Code:   " + ase.getErrorCode());
System.out.println("Error Type:       " + ase.getErrorType());
System.out.println("Request ID:       " + ase.getRequestId());
} catch (AmazonClientException ace) {
System.out.println("Caught an AmazonClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with AWS, "
+ "such as not being able to access the network.");
System.out.println("Error Message: " + ace.getMessage());
}
}
private static Map<String, AttributeValue> newItem(String name, int year, String rating, String... fans) {
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("name", new AttributeValue(name));
item.put("year", new AttributeValue().withN(Integer.toString(year)));
item.put("rating", new AttributeValue(rating));
item.put("fans", new AttributeValue().withSS(fans));
return item;
}
}

我收到以下错误,

.   ____          _            __ _ _
/\ / ___'_ __ _ _(_)_ __  __ _    
( ( )___ | '_ | '_| | '_ / _` |    
\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v1.5.8.RELEASE)
2017-11-08 13:44:58.450  INFO 21012 --- [           main] com.belcan.DynamoTest1Application        : Starting DynamoTest1Application on skmi5-7000 with PID 21012 (C:UsersStephenDesktopBCNProjects360Yieldswdev360yield360examplesDynamoTest1bin started by Stephen in C:UsersStephenDesktopBCNProjects360Yieldswdev360yield360examplesDynamoTest1)
2017-11-08 13:44:58.456  INFO 21012 --- [           main] com.belcan.DynamoTest1Application        : No active profile set, falling back to default profiles: default
2017-11-08 13:44:58.544  INFO 21012 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@59717824: startup date [Wed Nov 08 13:44:58 EST 2017]; root of context hierarchy
2017-11-08 13:44:59.089  INFO 21012 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-11-08 13:44:59.104  INFO 21012 --- [           main] com.belcan.DynamoTest1Application        : Started DynamoTest1Application in 1.185 seconds (JVM running for 2.316)
Starting Init()
Init()-1 Complete
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at com.amazonaws.internal.config.InternalConfig.<clinit>(InternalConfig.java:43)
at com.amazonaws.internal.config.InternalConfig$Factory.<clinit>(InternalConfig.java:304)
at com.amazonaws.util.VersionInfoUtils.userAgent(VersionInfoUtils.java:142)
at com.amazonaws.util.VersionInfoUtils.initializeUserAgent(VersionInfoUtils.java:137)
at com.amazonaws.util.VersionInfoUtils.getUserAgent(VersionInfoUtils.java:100)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:65)
at com.amazonaws.ClientConfigurationFactory.getDefaultConfig(ClientConfigurationFactory.java:46)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientConfigurationFactory.getDefaultConfig(AmazonDynamoDBClientConfigurationFactory.java:31)
at com.amazonaws.ClientConfigurationFactory.getConfig(ClientConfigurationFactory.java:36)
at com.amazonaws.client.builder.AwsClientBuilder.resolveClientConfiguration(AwsClientBuilder.java:163)
at com.amazonaws.client.builder.AwsClientBuilder.access$000(AwsClientBuilder.java:52)
at com.amazonaws.client.builder.AwsClientBuilder$SyncBuilderParams.<init>(AwsClientBuilder.java:411)
at com.amazonaws.client.builder.AwsClientBuilder.getSyncClientParams(AwsClientBuilder.java:354)
at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
at com.belcan.DynamoTest1Application.init(DynamoTest1Application.java:86)
at com.belcan.DynamoTest1Application.main(DynamoTest1Application.java:98)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 16 more
2017-11-08 13:44:59.130  INFO 21012 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@59717824: startup date [Wed Nov 08 13:44:58 EST 2017]; root of context hierarchy
2017-11-08 13:44:59.133  INFO 21012 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

你真的不必挖得太远就能看到错误。失败发生在main(),init()方法的第一行代码上。你可以看到,我在这个方法中放了几个println,看看我能走多远。我已经完成了init()的第一部分,即凭据检索。我在init()的第二部分AmazonDynamoDBClientBuilder中失败了,DynamoDB客户端就是在这里构建的。这些罐子好像有点怪怪的。最初的AWS Java代码是为maven编写的。我正在使用Gradle作为Spring Boot。我查看了原始的AWS pom.xml文件,发现它引用了两个依赖项,

aws-java-sdk-1.11.225
aws-kinesis-client-1.2.1

我把这两个包括在我的等级结构中。下面是我正在使用的罐子。

amazon-kinesis-client-1.8.7.jar
aws-java-sdk-1.11.225 (1).jar
aws-java-sdk-core-1.11.226 (1).jar
aws-java-sdk-dynamodb-1.11.226 (2).jar

有什么想法吗?看起来我少了一个罐子,或者没有装上正确的罐子。我已经做了两天了,但运气不好。任何帮助都会很棒。

将其添加到你的等级中。build:

compile("com.fasterxml.jackson.core:jackson-databind:2.9.2")

最新更新