当前位置: 首页 > 知识库问答 >
问题:

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

申屠项明
2023-03-14

我正在创建一个Spring应用程序,其中从AWS API调用信息,并将其转换为JSON,以便前端应用程序进行消化和显示。我目前正试图返回一个帐户上所有当前S3 bucket的列表,但遇到了一个问题,JSON响应如下:

“status”:500,“error”:“内部服务器错误”,“message”:“类型定义错误:[简单类型,类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

我创建了一个名为S3的类,它具有私有变量。其中一个是名为BucketList的列表类型。该类具有与这些变量相关联的代表性getter和setter。

我还尝试将其添加到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;
    }
}

任何关于为什么这不起作用的想法都很感激。

共有1个答案

祁嘉言
2023-03-14

问题在于Bucket类。Jackson默认情况下会像POJO-s一样处理所有提供的对象。每个POJO应该有getter/setter的列表。如果类没有,则对象被视为空。如果要像这样序列化类,可以:

  1. 使用getters创建额外的POJO类,并将其从原始AWS类映射到此POJO.
  2. 实现并注册此类的序列化程序。
  3. AWS模型手动转换为map-s和list-s,并将它们序列化。

另见:

    null
 类似资料:
  • 当我试图导航到一个endpoint时,我得到以下错误 类型定义错误:[简单类型,类org.hibernate.proxy.pojo.ByteBuddy.ByteBuddyInterceptor];嵌套异常为com.fasterxml.jackson.databind.exc.InvalidDefinitionException:未找到类org.hibernate.proxy.pojo.ByteBu

  • 下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不

  • 我有以下ORM对象(简化): 每行有: 主键 插入行时的时间戳 computed_values要存储的实际JSONB数据 JSONB来存储计算数据的日期列表。 虽然我对列没有问题,但是对象不能被SQLAlchemy JSON序列化程序序列化。 我的想法是为该列重新定义对象的序列化程序行为。要做到这一点,我必须定义自己的自定义JSON序列化程序,或者使用一些现成的序列化程序,比如orjson。因为我

  • com.fasterxml.jackson.databind.jsonMappingException:未发现用于java.io.BufferedReader类的序列化程序,也未发现用于创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.fail_on_empty_beans)(通过引用链:pj.core.bean.actionResult[“dat

  • 我有一个不能用Gson正确序列化的类(类只是name和HashMap),所以我编写了一个自定义序列化程序来从HashMap中打印名称和键值对。 此外,这是实际打印的内容,序列化整个对象并不像我所期望的那样工作,也不只是直接打印对象。 任何帮助都将不胜感激。

  • 我在一个Kafka消息中使用了我自己的类,它有一堆字符串数据类型。 我想我需要编写自己的序列化器并将其提供给生产者属性?

  • 我想创建一个自定义序列化程序,它只做一点点工作,然后将其余部分留给默认序列化。 例如: 通过为聚合对象创建其他自定义序列化器的想法,这些对象根据“特殊”属性值表现不同。然而,上面的代码不起作用,因为它毫不奇怪地进入了无限递归。 一旦我设置了属性,有没有办法告诉jackson使用默认序列化?我真的不想像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,并且我不想每次更改该类时都必须对序列化程序