【问题标题】:How to let resteasy create a class from a json property value that defines the type如何让resteasy从定义类型的json属性值创建一个类
【发布时间】:2021-08-20 12:27:37
【问题描述】:

客户端发送带有属性type 的JSON。 type 的可能值为 clipartimage 到 resteasy API。

在 API / 服务器端,resteasy 现在应该自动创建 java Clipart 类的实例或 Image 类的实例。根据客户端 JSON 中定义的type

我该怎么做?

【问题讨论】:

  • 所以基本上你将拥有ClipartImage 类优先权吗?您需要做的就是检查传入的type 是什么,您希望根据它创建相应先前类的实例?

标签: java json jackson jaxb resteasy


【解决方案1】:

以下解决方案做到了。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = JSONImageItem.class, name = ItemType.TYPE_IMAGE),
    @JsonSubTypes.Type(value = JSONClipartItem.class, name = ItemType.TYPE_CLIPART),
})
public abstract class JSONAbstractItem implements AbstractItem {
  JSONAbstractItem() {
    // for resteasy
  }
}

public interface AbstractItem {
  @JsonInclude(Include.NON_NULL)
  ItemType getType();
}

@JsonTypeName(ItemType.TYPE_IMAGE)
public class JSONImageItem extends JSONAbstractItem {
  JSONImageItem() {
  }
}

@JsonTypeName(ItemType.TYPE_CLIPART)
public class JSONClipartItem extends JSONAbstractItem {
  JSONClipartItem() {
    // for resteasy
  }
}

public enum ItemType {
  IMAGE, CLIPART;

  public static final String TYPE_IMAGE = "IMAGE";
  public static final String TYPE_CLIPART = "CLIPART";

  @JsonCreator
  public static ItemType fromString(String value) {
    return Arrays.stream(ItemType.values()).filter(v -> v.name().equalsIgnoreCase(value)).findFirst().orElse(null);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多