java Spring DTO中不同类型的有效负载

ecr0jaav  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(130)

在Spring(Java 17)中是否有处理这种数据(在请求体中)的最佳实践?
数据示例:

[
  { 
    "type": "message", 
    "common_data": "something",
    "payload": {"text": "something"}
  },
  { 
    "type": "id",
    "common_data": "something",
    "payload": {"id": 42}
  }
]

我的意思是JSON请求是一个具有不同有效负载类型的对象列表(所有类型都是确定的)

rsaldnfx

rsaldnfx1#

一个解决方案是使用@JsonTypeInfo。这允许您根据某些属性(在您的情况下,类型)将其转换为不同的类型。

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  @Type(value = TextPayload.class, name = "message"), 
  @Type(value = IdPayload.class, name = "id") 
})
abstract class Payload {}

class TextPayload extends Payload {
   String text;
}
class IdPayload extends Payload {
   Long id;
}

对于简单的用例,它可以是一个很好的解决方案,在这里阅读更多关于它的信息:https://www.baeldung.com/jackson-inheritance
不过,这会给你的应用程序带来一些Jackson的“魔力”。一个更简单的替代方案是反序列化为一个更通用的dto,包含所有字段,然后使用一个Map器(或工厂)来Map/创建基于此对象的示例:

record GenericDto (
    String text, Long id
);

// and
public Payload map (String type, GenericDto dto) {
   switch(type):    
        case "id": return new IdPayload(dto.id());
        case "message": return new TextPayload(dto.text());
        // ...
}

相关问题