You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中@RequestBody复杂JSON与多子类Java对象映射问题

解决Spring MVC中JSON多态对象映射问题

你遇到的问题核心在于Jackson默认无法自动识别父类Condition的子类(ComparisonCondition和BetweenCondition),它只会尝试把JSON字段映射到父类的属性上,所以当遇到value、value1这类父类没有的字段时就会抛出"未识别字段"的错误。下面是具体的解决步骤:

1. 给父类Condition添加Jackson多态注解

我们需要明确告诉Jackson,如何根据JSON中的operation字段来判断应该实例化哪个子类。在Condition类上添加以下Jackson注解:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "operation", // 指定用operation字段的值区分不同子类
    visible = true // 保留operation字段的原始值,不被Jackson处理后移除
)
@JsonSubTypes({
    // 映射operation值到对应的子类
    @JsonSubTypes.Type(value = ComparisonCondition.class, names = {"equalTo", "notEqualTo"}),
    @JsonSubTypes.Type(value = BetweenCondition.class, name = "between")
})
public class Condition {
    private String dataKey;
    private String dataType;
    private String operation;

    // 务必添加无参构造函数,Jackson默认需要它来实例化对象
    public Condition() {}

    // 生成所有属性的getter和setter方法
}

2. 确保子类配置正确

Jackson需要无参构造函数来实例化对象,同时属性必须有对应的getter/setter才能完成字段映射:

ComparisonCondition类

public class ComparisonCondition extends Condition {
    private String value;

    public ComparisonCondition() {}

    // getter和setter方法
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

BetweenCondition类

public class BetweenCondition extends Condition {
    private String value1;
    private String value2;

    public BetweenCondition() {}

    // getter和setter方法
    public String getValue1() {
        return value1;
    }

    public void setValue1(String value1) {
        this.value1 = value1;
    }

    public String getValue2() {
        return value2;
    }

    public void setValue2(String value2) {
        this.value2 = value2;
    }
}

3. 修正JSON中的拼写错误

你的JSON里有一个笔误:"dataType": "strubg"应该改成"dataType": "string",否则Jackson映射dataType字段时会出现不必要的异常。

4. 检查Filter和Student类的基础配置

确保Filter<T>类的泛型T(这里是Student)包含id和name属性,并且提供了无参构造函数以及对应的getter/setter方法,这样Jackson才能正确映射JSON中的entity部分。

完成以上步骤后,Spring MVC就能正确将你的JSON请求体映射到Filter<Student>对象,之前的"未识别字段"错误也会被解决。

内容的提问来源于stack exchange,提问作者liam xu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:17:45