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

AWS@LambdaFunction无法反序列化为POJO

诸腾
2023-03-14

我正在使用spring boot(2.26)和AWS SDK为Java(1.11.761)。

我的问题是@lambdafunction无法反序列化到我的POJO,失败原因是:

“com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.example.语句的实例(尽管至少存在一个创建者):没有可从[source:(byte[])”“{\”end\“:16,”id“:1,”start“:0,”text“:”hello,foobar!!!“,”type“:”st句“,”uuid“:”DE0134A93C1F4F2DBD910AE39438359D“,”warnings“:[]}”处的字符串值(“{”end“:16,

public interface TemplateLambda {
    @LambdaFunction(functionName="....")
    Sentence getSentence(TemplateInput input);

    @LambdaFunction(functionName="....")
    String getString(TemplateInput input);
}

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Sentence {

    @JsonIgnore
    private UUID uuid = UUID.randomUUID();

    private Long id;
    private String text;
    private String type;
    private List<Warning> warnings = new ArrayList<>();
    private Long start;
    private Long end;
}

调用对象:

final ObjectMapper objectMapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

final TemplateLambda lambda = LambdaInvokerFactory.builder()
            .lambdaClient(AWSLambdaClientBuilder.defaultClient())
            .objectMapper(objectMapper)
            .build(TemplateLambda.class);

TemplateInput input = new TemplateInput("Foobar");
try {
    String s = lambda.getString(input);
    Sentence sent = objectMapper.readValue(s, Sentence.class); // SUCCEEDS
    logger.info("THIS SUCCEEDS);

    Sentence output = lambda.getSentence(input); // FAILS
    logger.info("THIS FAILS");

} catch (Exception e) {
    e.printStackTrace();
}

我还验证了跳过@lambdafunction注释并手动调用会得到一个Byte[]格式的转义JSON字符串,即'\“{\”id\“:\123}\”‘。如果我不手动取消它并删除引号和尾随引号,我会得到同样的失败。

看起来,如果我请求字符串作为返回类型,SDK将处理不转义,但如果我请求POJO,它只是将转义字节[]交给jackson,而jackson失败了。

我可以在jackson或SDK上做什么配置来防止这种情况发生?我已经尝试从AWS SDk的Maven依赖项中排除jackson,以防我得到的版本冲突,但得到的结果是一样的。

共有1个答案

徐涵亮
2023-03-14

你需要一种方法让jackson来构造你的句子对象。有两种方法可以实现这一点:

  1. 添加空的构造函数以及getter和setter方法,您可能需要在每个字段(uuid除外)上添加@JsonProperty(“fieldname”)
  2. 添加一个带有@jsonCreator@jsonProperty(“filedname”)的构造函数,对于构造函数的每个参数,我也会添加getter方法
@JsonCreator
public Sentence(@JsonProperty("id")Long id,
     @JsonProperty("text")String text,
     @JsonProperty("type") String type,
     @JsonProperty("warnings") List<Warning> warnings,
     @JsonProperty("start") Long start,
     @JsonProperty("end") Long end) {
    this.id = id;
    this.text = text;
    this.type = type;
    this.warnings = new ArrayList<>();
    this.start = start;
    this.end = end;
}

在我的偏好中,为了使用不可变对象,第二种方法更好

 类似资料:
  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的

  • 问题内容: 在hibernate状态下执行条件查询时,出现以下异常: 可能是什么问题呢? PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。 问题答案: 问题在于被引用的实体对实体有另一个引用,并且该关系未由任何-like注释进行注释。

  • 问题内容: 我正在使用Hibernate的两个表,但我不明白为什么对于特定查询我有此问题。我希望有人意识到这个问题。 我有一个桌子用户 和一个桌子区域 日志说: 问题答案: 我建议仅在字段或getter上设置注释。我更喜欢田野,但那只是我的口味。 请参阅Hibernate中有关字段和属性访问的奇怪案例: 因此,要么将注释仅放置在字段上,要么仅放置在getters(properties)上。混合它们

  • 作为一个小项目,我一直在尝试制作一个小东西来读取序列化的lambda(本地或从FTP)并调用它们的run函数,作为测试的一部分,以在Windows中试验文件关联(即打开某些文件类型会用某个程序打开它们)等等,但无论我尝试什么,它似乎都无法正确地反序列化。 lambda是这样宣布的 并使用由ObjectOutputStream包装的[n可选]BufferedOutputStream包装的FileOu

  • 我想创建mysql字符串数组类型的数据字段。因此,我在我的spring-boot gradle项目中创建模型类,如下所示。 这是我的存储库,它通过JpaRepository扩展 但是当我在controller类中运行'getQuestions()'函数时,它给出了以下错误。 嵌套异常为org.hibernate.type.serializationexception:无法反序列化org.sprin