在自定义Java AWS应用程序中找不到类的序列化程序

WiscoRadio:

我正在创建一个Spring应用程序,该应用程序在其中调用AWS API中的信息,并将其转换为JSON,以便前端应用程序进行摘要和显示。我目前正在尝试返回帐户中所有当前S3存储桶中的列表,但遇到了JSON响应为的问题:

状态”:500,“错误”:“内部服务器错误”,“消息”:“类型定义错误:[简单类型,类software.amazon.awssdk.services.s3.model.Bucket];嵌套的异常是com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为类software.amazon.awssdk.services.s3.model.Bucket找到序列化程序,也没有发现创建BeanSerializer的属性(为避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS) (通过参考链:com.landsend.clouddashboard.data.Class.S3 [\“ bucketList \”]-java.util.Collections $ UnmodifiableRandomAccessList [0])“,”路径“:” / api / s3 / buckets“

我创建了一个名为S3的类,该类具有私有变量。其中之一是名称为bucketList的List类型。此类具有代表性的获取器和设置器,并与这些变量关联。

我也尝试将其添加到applications.properties文件中:

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

这确实导致错误消失,但最终我得到了一个空的JSON文件。

控制器类

@RestController
@RequestMapping(value="/api")
public class S3Controller {

    @Autowired
    private S3Service s3Service;

    @RequestMapping(method= RequestMethod.GET, value="/s3/buckets")
    public S3 ListBuckets(){
        return s3Service.listBucket();
    }
}

服务等级

@Service
public class S3Service {

    private S3Access s3Access;

    @Autowired
    public S3Service(S3Access s3Access){
        this.s3Access = s3Access;
    }
    public S3 listBucket(){
        //Any Additional business logic would go here
        return s3Access.listBucket();
    }
}

访问等级

@Repository
public class S3Access implements S3Repository {

    @Autowired
    private S3 s3Instance;

    private Region region = Region.US_EAST_1;
    private S3Client s3Client = 
                     S3Client.builder().region(region).build();

    @Override
    public S3 listBucket() {
        ListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();
        ListBucketsResponse listBucketsResponse = s3Client.listBuckets(listBucketsRequest);
        s3Instance.setBucketList(listBucketsResponse.buckets());
        return s3Instance;
    }
}

S3构造类

@Component
public class S3 {
    private String fileName;
    private String bucketName;
    private int bucketSize;
    private List<Bucket> bucketList;

    public List<Bucket> getBucketList() {
        return bucketList;
    }

    public void setBucketList(List<Bucket> bucketList) {
        this.bucketList = bucketList;
    }
}

感谢您对为什么此功能不起作用的任何想法。

MichałZiober:

问题出在Bucket类上。Jackson默认情况下,将所有提供的对象都视为POJO-s。每个POJO都应具有getters/的列表setters如果类没有它们,则对象被视为空。如果要序列化此类,则可以:

  1. 使用创建额外的POJO类,getters并将其从原始AWS映射到this POJO
  2. 实现并注册此类的序列化器。
  3. 手动AWS模型转换Map-s和List-s并进行序列化。

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章