【问题标题】:Java DynamoDB Streams Lambda: "Cannot deserialize value of type `java.util.Date` from Floating-point value (token `JsonToken.VALUE_NUMBER_FLOAT`)"Java DynamoDB Streams Lambda:“无法从浮点值反序列化 `java.util.Date` 类型的值(令牌`JsonToken.VALUE_NUMBER_FLOAT`)”
【发布时间】:2021-02-27 04:50:24
【问题描述】:

我正在编写一个 AWS Lambda,它将侦听 DynamoDB Streams 事件并使用这些事件来更新 Elasticsearch 索引。我的代码是使用 Quarkus 框架编写的,我发现 guides and examples 显示了如何执行此操作,所以我的代码如下所示:

import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;

/**
 * The AWS Lambda used to update an Elasticsearch index when new records are
 * written to DynamoDB
 * 
 * @author XXX
 *
 */
@Named("dynamoDBSearchIndexEventHandler")
public class DynamoDBSearchIndexEventHandler implements RequestHandler<DynamodbEvent, Void> {

    /**
     * Logger for this class
     */
    private static final Logger logger = LoggerFactory.getLogger(DynamoDBSearchIndexEventHandler.class);

    /*
     * (non-Javadoc)
     *
     * @see
     * com.amazonaws.services.lambda.runtime.RequestHandler#handleRequest(java.lang.
     * Object, com.amazonaws.services.lambda.runtime.Context)
     */
    @Override
    public Void handleRequest(DynamodbEvent input, Context context) {
        if (logger.isDebugEnabled()) {
            logger.debug("handleRequest(DynamodbEvent, Context) - start"); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("handleRequest(DynamodbEvent, Context) - input={}", input); //$NON-NLS-1$
        }

        if (logger.isDebugEnabled()) {
            logger.debug("handleRequest(DynamodbEvent, Context) - end"); //$NON-NLS-1$
        }
        return null;
    }

}

当我将一个项目写入我的 DynamoDB 表时,我看到我的 Lambda 正在被调用,但是我得到了以下异常:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.Date` from Floating-point value (token `JsonToken.VALUE_NUMBER_FLOAT`)

我不知道为什么序列化会失败。如果我修改我的 Lambda 以将 Map&lt;String, AttributeValue&gt; 作为输入而不是 DynamodbEvent 它工作得很好。我可以看到Map 填充了所有预期值。但是,我无法获得 DynamodbEvent,然后我可以使用它来迭代其 DynamodbStreamRecord 对象以更新我的索引。

知道这可能是什么问题吗?

【问题讨论】:

    标签: json aws-lambda jackson amazon-dynamodb amazon-dynamodb-streams


    【解决方案1】:

    我经常遇到 Java Lambda 和反序列化数据的问题。此时我已经放弃,只使用 JsonPath:

    public class S3EventLambdaHandler implements RequestStreamHandler {
        public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
    
            try {
                List<String> keys = JsonPath.read(inputStream, "$.Records[*].s3.object.key");
    
                for( String nextKey: keys )
                    System.out.println(nextKey);
            }
            catch( IOException ioe ) {
                context.getLogger().log("caught IOException reading input stream");
            }
        }
    

    这是处理an S3 event,但概念应该相同。

    【讨论】:

      【解决方案2】:

      原来,这是使用 Quarkus 的 known issue。我使用了问题记录中提供的ObjectMapperCustomizer,现在一切正常。

      【讨论】:

        猜你喜欢
        • 2019-08-09
        • 1970-01-01
        • 2020-07-22
        • 2023-01-25
        • 1970-01-01
        • 2017-09-06
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多