我如何将json中的Java对象的实例类型发送到Java spring-server发布请求?

问题描述 投票:0回答:1

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

BaseClass:

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

现在我想将json文件发送到我的spring服务器,并且该服务器必须检查它是SubClass类型还是SubClass2类型


    @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
}

除了基类列表之外,我尝试将它们强制转换为特定的子类。我怎样才能做到这一点?以下操作无效。

if (abc instanceof SubClass) {
                log.info("abc is instance of SubClass");
} else if (abc instanceof SubClass2) {
                log.info("abc is instance of SubClass2");
} 
java spring spring-boot jpa instanceof
1个回答
0
投票

如果您接受BaseClass,Spring会将您的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");
} 

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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.