【问题标题】:Where should the JsonSubTypes be read from?应该从哪里读取 JsonSubTypes?
【发布时间】:2019-01-04 13:06:49
【问题描述】:

这个问题是对我发布的另一个问题的支持,因为我正在寻找关于 JsonSubTypes

的序列化/验证如何工作的清晰说明

其他问题:InvalidSchemaException using JsonSubTypes, not picking up what I defined in the base interface

假设我有一个基类 A

A 实现 BaseInterface

如果我有一个扩展 A 的子类 B,但实现了它自己的接口,例如 AlpahInterface、BetaInterface、CharlieInterface。这就是验证失败的问题,因为 AlphaInterface 仅列出例如LAMA 等验证不知道基础 BaseInterface 中定义的所有其他类型。

子类 B 只实现了 AlphaInterface 定义的任何东西,忽略了它扩展 BaseInterface 的事实,也忽略了其他实现的接口,显然没有注意以下事实B 扩展了实现 BaseInterface 的 A。我可以验证这一点,因为我向 AlphaInterface 添加了基本接口中定义的所有子类型,并且一切正常,但我不想在每个接口中定义每个可能的子类型,因为它们并不都与实现它们的类相关.

我原以为会选择扩展的 A 实现或所有 B 实现的接口,而不仅仅是列表中的第一个接口。

请有人解释一下,因为过去两天我在网上所做的所有阅读都没有为我解决这个问题。如果有人想打开讨论聊天,那也太好了!

谢谢。

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
  @Type(value = CatTopic.class, name = "CAT"),
  @Type(value = DogTopic.class, name = "DOG"),
  @Type(value = FishTopic.class, name = "FISH"),
  @Type(value = LamaTopic.class, name = "LAMA")
})
public interface BaseInterface {}

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
  @Type(value = LamaTopic.class, name = "LAMA")
})
public interface AlpahInterface extends BaseInterface {}


// Something to extend A
public class B extends A implements AlpahInterface, BetaInterface, CharlieInterface {}

【问题讨论】:

  • 玩弄我的 AlphaInterface 代码,如果我将 JsonTypeInfo.Id.NAME 更改为 JsonTypeInfo.Id.MINIMAL_CLASS 它能够验证。有人可以指出一些很好的文档来了解杰克逊的这些东西是怎么回事吗?我正在寻找示例,但这是基于您已经了解它的前提,而我想阅读功能的详细信息。谢谢
  • 使用 MINIMAL_CLASS,我创建的新项目工作但打破了旧项目。仍在试图弄清楚这一点。我们有 3 个人在解决这个问题,我们唯一能达成共识的是,无论是谁实现了我们的这段代码,我们都无法在任何在线示例中找到这样做的方式。我们很难过。不打算更改代码库,因为我们有一个全新版本的代码,这将被逐步淘汰,这样做需要重新编码 300 多个文件,谁知道它可能会产生什么其他影响。呃

标签: java json validation jackson polymorphism


【解决方案1】:

我不清楚这段代码应该在 JsonSubTypes 的主列表中读取的位置,但我设法解决了相关的发布问题。 终于在我的相关帖子中找到了处理主要问题的方法。 public abstract @interface JsonTypeInfo

需要做的是对于 JsonSubTypes 中定义的每个类,您还必须在该类上指定 @JsonTypeName("ClassName") 例如

@JsonTypeName("CAT")
public class CatTopic extends A implements AlpahInterface, BetaInterface, CharlieInterface {}

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2011-11-27
    • 2021-07-17
    • 2017-10-11
    • 2014-12-19
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多