AWS Java SDK v2中DynamoDbMapper.S3Link等价实现迁移咨询
AWS Java SDK v2 中 DynamoDbMapper.S3Link 的替代方案
AWS Java SDK v2 已经移除了DynamoDbMapper.S3Link类,没有直接的等价实现。这个设计变化是为了遵循v2模块化、解耦的核心理念,将DynamoDB与S3的功能完全分离,不再提供跨服务的封装类。你需要通过S3 SDK v2直接实现原S3Link的功能,同时调整POJO的结构。
1. 调整POJO结构
原POJO中的S3Link字段需要替换为存储S3对象标识的基础字段,推荐两种方式:
方式一:拆分桶名和对象键为独立字段
class Pojo { // 存储S3桶名 private String s3Bucket; // 存储S3对象键 private String s3Key; // 构造方法、Getter、Setter }
方式二:自定义封装类
如果需要更结构化的存储,可以自定义一个类封装桶名和对象键:
class S3ObjectRef { private String bucket; private String key; // 构造方法、Getter、Setter } class Pojo { private S3ObjectRef s3Ref; // 构造方法、Getter、Setter }
2. 实现原S3Link的核心功能
原S3Link的上传、下载、生成预签名URL等功能,需要通过S3 SDK v2的S3Client直接实现:
初始化S3Client
// 使用默认配置初始化S3Client S3Client s3Client = S3Client.create(); // 或者自定义配置(比如指定区域) S3Client s3Client = S3Client.builder() .region(Region.US_EAST_1) .build();
上传文件到S3
PutObjectRequest putRequest = PutObjectRequest.builder() .bucket(pojo.getS3Bucket()) .key(pojo.getS3Key()) .build(); // 上传本地文件 s3Client.putObject(putRequest, Paths.get("/local/path/to/file")); // 上传字节流 s3Client.putObject(putRequest, RequestBody.fromBytes("文件内容".getBytes()));
下载S3对象到本地
GetObjectRequest getRequest = GetObjectRequest.builder() .bucket(pojo.getS3Bucket()) .key(pojo.getS3Key()) .build(); // 下载到本地路径 s3Client.getObject(getRequest, Paths.get("/local/save/path")); // 获取对象字节流 ResponseBytes<GetObjectResponse> responseBytes = s3Client.getObjectAsBytes(getRequest); byte[] content = responseBytes.asByteArray();
生成预签名URL(上传/下载)
// 生成上传用的预签名URL(有效期10分钟) PresignedPutObjectRequest presignedPut = s3Client.utilities() .presignPutObject(PutObjectRequest.builder() .bucket(pojo.getS3Bucket()) .key(pojo.getS3Key()) .build(), Duration.ofMinutes(10)); String uploadPresignedUrl = presignedPut.url().toString(); // 生成下载用的预签名URL(有效期10分钟) PresignedGetObjectRequest presignedGet = s3Client.utilities() .presignGetObject(GetObjectRequest.builder() .bucket(pojo.getS3Bucket()) .key(pojo.getS3Key()) .build(), Duration.ofMinutes(10)); String downloadPresignedUrl = presignedGet.url().toString();
内容的提问来源于stack exchange,提问作者Seagull
相关产品推荐
相关产品推荐

