You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫描DynamoDB的image_id到字符串列表返回空数组排查求助

问题排查:Lambda扫描DynamoDB返回空image_id数组

问题场景

前端基于Angular构建POST请求,后端Java编写的AWS Lambda函数需从DynamoDB的container_master表(image_id为分区键,表内存在多条数据)获取所有image_id,但请求返回空数组;硬编码数组可正常渲染,怀疑扫描逻辑存在问题。


核心错误分析

1. getAllImageIds方法无返回值

查看HomeScreen_Entity.java中的getAllImageIds方法,方法内部构建了imageIds列表,但未添加返回语句,导致调用该方法时返回null。在ECS_DAO.java的fetchData方法中,遍历null会触发NullPointerException,被catch块捕获后entities保持为空,最终返回空数组。

2. 次要问题:DynamoDB客户端重复创建

HomeScreen_Entity的构造函数每次实例化都会创建新的DynamoDB客户端和Mapper,在Lambda环境中重复创建客户端会增加开销,不符合最佳实践。


修复方案

1. 修复getAllImageIds的返回值

修改HomeScreen_Entity.java中的getAllImageIds方法,添加返回语句:

public List<String> getAllImageIds() {
    ScanRequest scanRequest = new ScanRequest()
            .withTableName("container_master")
            .withAttributesToGet("image_id");
    ScanResult result = dynamoDBClient.scan(scanRequest);
    List<String> imageIds = new ArrayList<>();
    for (Map<String, com.amazonaws.services.dynamodbv2.model.AttributeValue> item : result.getItems()) {
        if (item.containsKey("image_id")) {
            imageIds.add(item.get("image_id").getS());
        }
    }
    return imageIds; // 新增返回语句
}

2. 优化DynamoDB客户端复用

将DynamoDB客户端和Mapper改为静态成员,在类加载时初始化一次,避免重复创建:

@DynamoDBTable(tableName = "container_master")
public class HomeScreen_Entity {
    private String image_id;
    private static final Regions REGION = Regions.US_WEST_2;
    private static final AmazonDynamoDB dynamoDBClient;
    private static final DynamoDBMapper mapper;

    // 静态初始化块,仅在类加载时执行一次
    static {
        dynamoDBClient = AmazonDynamoDBClientBuilder.standard().withRegion(REGION).build();
        mapper = new DynamoDBMapper(dynamoDBClient);
    }

    public HomeScreen_Entity() {
        // 空构造函数,满足DynamoDBMapper要求
    }

    @DynamoDBHashKey(attributeName = "image_id")
    public String getImage_id() {
        return image_id;
    }

    public void setImage_id(String image_id) {
        this.image_id = image_id;
    }

    // 修复后的getAllImageIds方法
    public List<String> getAllImageIds() {
        ScanRequest scanRequest = new ScanRequest()
                .withTableName("container_master")
                .withAttributesToGet("image_id");
        ScanResult result = dynamoDBClient.scan(scanRequest);
        List<String> imageIds = new ArrayList<>();
        for (Map<String, com.amazonaws.services.dynamodbv2.model.AttributeValue> item : result.getItems()) {
            if (item.containsKey("image_id")) {
                imageIds.add(item.get("image_id").getS());
            }
        }
        return imageIds;
    }
}

3. 额外优化:使用DynamoDBMapper简化扫描

手动解析ScanResult容易出错,可改用DynamoDBMapper的扫描方法自动映射实体类,简化代码:

public List<String> getAllImageIds() {
    DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    // 指定只返回image_id字段,减少数据传输
    scanExpression.setProjectionExpression("image_id");
    List<HomeScreen_Entity> entities = mapper.scan(HomeScreen_Entity.class, scanExpression);
    return entities.stream()
            .map(HomeScreen_Entity::getImage_id)
            .collect(Collectors.toList());
}

验证

修复getAllImageIds的返回值后,ECS_DAO可正确获取image_id列表,构建实体类集合;ECS_BO转换为字符串列表返回给前端,即可得到非空数组。

内容的提问来源于stack exchange,提问作者Joshua Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:22:44