Kinesis Stream PutRecord 失败:无法将请求编组到 JSON
Kinesis Stream PutRecord Failing : Unable to marshall request to JSON
我正在将事务写入 Kinesis Stream(使用 AWS SDK,JAVA),但 putRecord 失败,原因为 "Marshalling error"。我试图发送一个简单的字符串(而不是我的复杂对象),但仍然出现相同的错误。下面是堆栈跟踪片段。
AWS SDK 版本:1.11.76
com.amazonaws.SdkClientException: Unable to marshall request to JSON: com.fasterxml.jackson.dataformat.cbor.CBORGenerator.getOutputContext()Lcom/fasterxml/jackson/core/json/JsonWriteContext;
at com.amazonaws.services.kinesis.model.transform.PutRecordRequestMarshaller.marshall(PutRecordRequestMarshaller.java:85)
at com.amazonaws.services.kinesis.AmazonKinesisClient.putRecord(AmazonKinesisClient.java:1365)
通过从我的包中删除 Jackson Dependency 解决。
原因:我对 Jackson 的依赖项导入与 AWS SDK 对 Jackson 的依赖项之间存在冲突。 Kinesis 客户端使用 Jackson 进行编组。我正在使用 Jackson 的最新版本,这导致了依赖冲突。
此处的另一个解决方案是确保您包含的 Jackson 版本与亚马逊默认包含在 Kinesis 中的版本不冲突。
对 Jackson 进行了重大更改,如果您手动包含更新的版本,但您使用的 AWS SDK 版本使用具有重大更改的旧版本,那么您将在 运行 时产生冲突该项目。或相反亦然。
因此解决方案是升级您的 AWS SDK 或降级您的 Jackson 客户端。我将通过 libs.gradle 摘录提供对我有用的每个 API 的版本:
ext.versions = [
spring: '4.3.5.RELEASE',
awsServerlessJavaContainer: '0.4',
jackson: '2.8.6'
]
ext.libs = [
dynamoDbLocal: 'com.amazonaws:DynamoDBLocal:1.11.0.1',
aws: [
dynamodb: 'com.amazonaws:aws-java-sdk-dynamodb:1.11.100',
lambda: 'com.amazonaws:aws-lambda-java-core:1.1.0',
lambdaEvents: 'com.amazonaws:aws-lambda-java-events:1.3.0',
kinesis: 'com.amazonaws:amazon-kinesis-client:1.7.3',
sns: 'com.amazonaws:aws-java-sdk-sns:1.11.115',
],
awsServerlessJavaContainer: [
spring: "com.amazonaws.serverless:aws-serverless-java-container-spring:${versions.awsServerlessJavaContainer}"
],
guava : 'com.google.guava:guava:18.0',
jackson: [
databind: "com.fasterxml.jackson.core:jackson-databind:${versions.jackson}",
cbor: "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:${versions.jackson}"
],
]
我正在将事务写入 Kinesis Stream(使用 AWS SDK,JAVA),但 putRecord 失败,原因为 "Marshalling error"。我试图发送一个简单的字符串(而不是我的复杂对象),但仍然出现相同的错误。下面是堆栈跟踪片段。
AWS SDK 版本:1.11.76
com.amazonaws.SdkClientException: Unable to marshall request to JSON: com.fasterxml.jackson.dataformat.cbor.CBORGenerator.getOutputContext()Lcom/fasterxml/jackson/core/json/JsonWriteContext;
at com.amazonaws.services.kinesis.model.transform.PutRecordRequestMarshaller.marshall(PutRecordRequestMarshaller.java:85)
at com.amazonaws.services.kinesis.AmazonKinesisClient.putRecord(AmazonKinesisClient.java:1365)
通过从我的包中删除 Jackson Dependency 解决。 原因:我对 Jackson 的依赖项导入与 AWS SDK 对 Jackson 的依赖项之间存在冲突。 Kinesis 客户端使用 Jackson 进行编组。我正在使用 Jackson 的最新版本,这导致了依赖冲突。
此处的另一个解决方案是确保您包含的 Jackson 版本与亚马逊默认包含在 Kinesis 中的版本不冲突。
对 Jackson 进行了重大更改,如果您手动包含更新的版本,但您使用的 AWS SDK 版本使用具有重大更改的旧版本,那么您将在 运行 时产生冲突该项目。或相反亦然。
因此解决方案是升级您的 AWS SDK 或降级您的 Jackson 客户端。我将通过 libs.gradle 摘录提供对我有用的每个 API 的版本:
ext.versions = [
spring: '4.3.5.RELEASE',
awsServerlessJavaContainer: '0.4',
jackson: '2.8.6'
]
ext.libs = [
dynamoDbLocal: 'com.amazonaws:DynamoDBLocal:1.11.0.1',
aws: [
dynamodb: 'com.amazonaws:aws-java-sdk-dynamodb:1.11.100',
lambda: 'com.amazonaws:aws-lambda-java-core:1.1.0',
lambdaEvents: 'com.amazonaws:aws-lambda-java-events:1.3.0',
kinesis: 'com.amazonaws:amazon-kinesis-client:1.7.3',
sns: 'com.amazonaws:aws-java-sdk-sns:1.11.115',
],
awsServerlessJavaContainer: [
spring: "com.amazonaws.serverless:aws-serverless-java-container-spring:${versions.awsServerlessJavaContainer}"
],
guava : 'com.google.guava:guava:18.0',
jackson: [
databind: "com.fasterxml.jackson.core:jackson-databind:${versions.jackson}",
cbor: "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:${versions.jackson}"
],
]