首页 > 解决方案 > 如何将 JSON 中 Java 对象的实例类型发送到 Java Spring-Server Post 请求?

问题描述

我有一个基类和三个扩展类。例如:

基类:

public BaseClass {
 int id;
} 
public SubClass extends BaseClass {
 int sub1;
}
public SubClass2 extends BaseClass {
 int sub2;
}

现在我想向我的 spring 服务器发送一个 json 文件,服务器必须检查它是 SubClass-type 还是 SubClass2-type


    @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> create(@RequestBody List<BaseClass> entry);

发送 JSON:

{
    "id": 1,
    "sub1": 1
},
{
    "id": 2,
    "sub2": 2
}

我除了 BaseClasses 的列表,但尝试将它们转换为特定的子类。我怎样才能做到这一点?以下没有工作。

if (abc instanceof SubClass) {
                log.info("abc is instance of SubClass");
} else if (abc instanceof SubClass2) {
                log.info("abc is instance of SubClass2");
} 

标签: javaspringspring-bootjpainstanceof

解决方案


如果您接受BaseClassSpring 将映射您的 json 以符合仅BaseClass忽略所有其他字段。因此,您对子类的检查根本不起作用。

最简单的解决方案是将数据作为纯文本接受,然后手动尝试使用 GSON 或类似的东西将其映射到您的模型

new Gson().fromJson("{
    "id": 1,
    "sub1": 1
}", SubClass.class);

但这是处理此问题的不好方法。您的方法需要在架构上进行更改。data最简单的方法是像这样向您的模型引入字段

{
    "id": 1,
    "data": {
         "key": "sub1",
         "value": 1
     },
},
public Data {
 String key;
 int value
} 

public BaseClass {
 int id;
 Data data;
} 

这样你就可以检查

if (abc.data.key.equals("sub1")) {
                log.info("abc is sub1");
} else if (abc.data.key.equals("sub1")) {
                log.info("abc is sub2");
} 

这将需要更复杂的进一步实现,但它会起作用。

希望能帮助到你。


推荐阅读