gpt4 book ai didi

java - 在 Jackson(和 MrBean)的反序列化时使用多态性

转载 作者:行者123 更新时间:2023-11-29 09:15:43 26 4
gpt4 key购买 nike

我正在使用 Jackson 将一些 JSON 反序列化为 Java POJO。我用我的对象映射器注册了 MrBean 模块,所以我所要做的就是定义一堆接口(interface),POJO 是基于这些接口(interface)自动生成的。

我想要一个 Credentials 接口(interface),其中包含扩展它的各种类型的凭证,例如UsernamePasswordCredentials 和 CertificateFileCredentials。

在没有任何注释或其他咒语的情况下执行此操作以尝试使其工作会在我的单元测试中出现以下错误:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "username" (Class org.codehaus.jackson.generated.SCRUBBED.Credentials), not marked as ignorable
at [Source: java.io.StringReader@e0b6f5; line: 32, column: 29] (through reference chain: HostConfiguration["hostDefinitions"]->HostDefinition["credentials"]->Credentials["username"])

我也followed the instructions at another StackOverflow post ,我遇到了同样的错误。

这个错误是有道理的; Jackson 试图将我的 JSON 文件的内容映射到一个空接口(interface)。但是,我(也许天真地)希望 Jackson 寻找扩展基本 Credentials 接口(interface)的接口(interface),并尝试将这些接口(interface)中的字段与它在 JSON 对象中找到的字段相匹配。

我在 Jackson wiki 上看到了一些使用 JSON 对象中的元信息的示例,例如用 "@class":"foo.bar.CertificateFileCredentials" 装饰一个对象,但我宁愿避免任何这种情况,因为我的 JSON 输入将由其他服务自动生成,而那些其他服务不必了解我的服务的内部结构。

谢谢!

最佳答案

您将如何定义实际的实现类?作为附加接口(interface)?那些应该正确生成;但问题是在反序列化过程中:如果有多种选择,反序列化器必须有某种方法来找出要使用的实际类型。为此,如您所见,建议使用 @JsonTypeInfo

关于java - 在 Jackson(和 MrBean)的反序列化时使用多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com