【问题标题】:How to send the instance type of a Java Object in JSON to Java Spring-Server Post request?如何将 JSON 中 Java 对象的实例类型发送到 Java Spring-Server Post 请求?
【发布时间】:2020-05-17 01:35:46
【问题描述】:

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

基类:

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");
} 

【问题讨论】:

    标签: java spring spring-boot jpa instanceof


    【解决方案1】:

    如果您接受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");
    } 
    

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2020-06-17
      • 2019-12-20
      • 2018-08-09
      相关资源
      最近更新 更多