java - SpringBoot @RequestBody 抽象类验证

标签 java spring-boot javax.validation

我正在尝试在我的 spring-boot 应用程序中模拟 OpenAPI 规范的 oneOf 构造。 我有一个抽象类Apple

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

和两个子类

public class RedApple extends Apple {

}

public class GreenApple extends Apple {

}

这也是我的休息 Controller

@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

当我对非抽象类执行完全相同的操作并且没有 JsonSubTypes 和 JsonTypeInfo 注释时,一切都像魅力一样工作。 我在这里缺少什么?

谢谢

最佳答案

visible = true 添加为 JsonTypeInfo 的参数解决了该问题 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,visible = true,property =“color”)

关于java - SpringBoot @RequestBody 抽象类验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71831089/

相关文章:

java - JAR更新后Spring boot自动重启

java - 无法从 Json 字符串创建对象列表

java - Spring boot 与不同数据库环境的集成测试

java - 是否可以向父类(super class)型中声明的属性添加 javax.validation 注释?

java - Eclipse 从资源读取文件 NullPointerException

java - ExpectedConditions.or 函数未按预期工作

java - 哪个更有效,为什么?

java - 从一组 HTML 文件中提取表格内容的最佳方法是什么?