簡體   English   中英

SpringBoot @RequestBody 抽象驗證 class

[英]SpringBoot @RequestBody validation of abstract class

我正在嘗試在我的 spring-boot 應用程序中模擬來自 OpenAPI 規范的oneOf構造。 我有一個抽象的 class 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 {

}

這也是我的 rest 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"} 作為正文,驗證也會失敗,並顯示一條消息說顏色不能是 null

當我使用非抽象 class 並且沒有 JsonSubTypes 和 JsonTypeInfo 注釋做完全相同的事情時,一切都像魅力一樣。 我在這里錯過了什么?

謝謝

你試圖創建的 object 是抽象的 class,正如我們所知,抽象類不能被實例化抽象的整個想法是避免訪問 class 本身,而不是如果你傳遞 class object 已經實現了 9815918218 抽象 82183解決你的問題

例如通過紅色

 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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM