SpringBoot @RequestBody 抽象验证class

SpringBoot @RequestBody validation of abstract class

我正在尝试在我的 spring-boot 应用程序中模拟来自 OpenAPI 规范的 oneOf 构造。 我有一个摘要class苹果

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "color")
@JsonSubTypes({
        @JsonSubTypes.Type(value = RedApple.class, name = "RED"),
        @JsonSubTypes.Type(value = GreenApple.class, name = "GREEN")
})
public abstract class Apple {

    @NotNull
    private Color color;

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public enum Color {
        RED, GREEN
    }
}

和两个子classes

public class RedApple extends Apple {

}

public class GreenApple extends Apple {

}

还有我的休息控制器

@RestController
@RequestMapping("/apples")
public class AppleController {

    @PostMapping
    public ResponseEntity<Void> createApple(@Valid @RequestBody Apple apple) {
        return ResponseEntity.created(URI.create("/foo")).build();
    }
}

问题是@Valid 没有正确验证枚举字段。 即使我将 {"color": "RED"} 作为正文发送,验证也会失败,并显示一条消息说 color 不能为 null

当我用非抽象 class 并且没有 JsonSubTypes 和 JsonTypeInfo 注释做完全相同的事情时,一切都像魅力一样。 我在这里错过了什么?

谢谢

您尝试创建的对象是抽象的 class,正如我们所知,抽象 classes 不能被实例化整个抽象的想法是避免访问那个 class 本身,相反,如果您传递实现了抽象 class 的 class 对象将解决您的问题

例如通过 RED

 public ResponseEntity<Void> createApple(@Valid @RequestBody RedApple apple) {
        return ResponseEntity.created(URI.create("/foo")).build();
    }

visible = true 作为参数添加到 JsonTypeInfo 解决了这个问题 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, visible = true, property = "color")