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