Kinesis Stream PutRecord失败:无法对JSON的请求进行编组

时间:2017-01-17 04:40:33

标签: java aws-sdk amazon-kinesis

我正在将事务写入Kinesis Stream(使用AWS SDK,JAVA),但putRecord因“编组错误”而失败。我试图发送一个简单的字符串(而不是我的复杂对象),但仍然得到相同的错误。下面是stacktrace片段。

AWS开发工具包版本: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)

2 个答案:

答案 0 :(得分:9)

通过从我的包中删除Jackson Dependency解决。 原因:我对Jackson的依赖导入与AWS SDK对Jackson的依赖性之间存在冲突。 Kinesis Client使用Jackson进行编组。我使用的是杰克逊的最新版本,这导致了依赖性冲突。

答案 1 :(得分:0)

此处的另一个解决方案是确保您所包含的Jackson版本和默认情况下包含在Kinesis中的一个版本不存在冲突。

对杰克逊进行了重大更改,如果您手动包含较新版本,但您正在使用的AWS SDK版本使用的旧版本具有重大更改,那么您将在运行项目时产生冲突。或相反亦然。

因此,解决方案是升级您的AWS开发工具包或降级您的杰克逊客户端。我将使用libs.gradle摘录提供每个API的版本:

@RequestMapping(value="/assetUpload", method = RequestMethod.POST)
public void assetUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("qqfile") MultipartFile file) throws ServletException, IOException { ....

ext.versions = [
    spring: '4.3.5.RELEASE',
    awsServerlessJavaContainer: '0.4',
    jackson: '2.8.6'