我正在尝试在我的 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/