Java Spring -决定从哪个实体创建对象的REST控制器

rsaldnfx  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(133)

我有3个实体:Book(父对象)、AntiqueBook(扩展书籍)、ScienceJournal(扩展书籍)。
AntiqueBook和ScienceJournal与Book的区别在于它们都比父对象多一个属性(分别为releaseYearscienceindex)。
控制器中用于创建新Book对象的端点:

@PostMapping("/books")
Book newBook(@RequestBody Book book) {
    return service.save(book);
}

使用中的方法:

public Book save(Book book) {
    return repository.save(book);
}
    • 如何仅使用此终结点创建AntiqueBook和ScienceJournal对象?例如,检查@RequestBody是否具有属性releaseYear(创建AntiqueBook)或scienceIndex(创建ScienceJournal)。如果它不具有这两个属性中的任何一个,则创建Book。**

目前,作为一种解决方案,我为AntiqueBook和ScienceJournal创建了两个额外的终结点,但我希望避免这种情况。我还遇到了"更新"终结点的问题。如果我能解决这个问题,那么我也能解决那个问题。

x7yiwoj4

x7yiwoj41#

您必须使用@JsonTypeInfo@JsonSubtypes注解Book DTO,以便Jackson/Spring知道如何解组它。
下面是一个例子:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = AntiqueBook.class, name = "ANTIQUE"),
        @JsonSubTypes.Type(value = ScienceBook.class, name = "SCIENCE")
})
public class Book {

    private final String isbn;

    public Book(String isbn) {
        this.isbn = isbn;
    }

    public String getIsbn() {
        return isbn;
    }
}
public class AntiqueBook extends Book{

    private final String year;

    public AntiqueBook(String isbn, String year) {
        super(isbn);
        this.year = year;
    }

    public String getYear() {
        return year;
    }
}
public class ScienceBook extends Book{

    private final String author;

    public ScienceBook(String isbn, String author) {
        super(isbn);
        this.author = author;
    }

    public String getAuthor() {
        return author;
    }
}
@RestController
public class BookController {

    @PostMapping("/books")
    Book newBook(@RequestBody Book book) {
        return book;
    }

}
$>curl -X POST localhost:8080/books -d '{"isbn":"AAAA", "year":"2020", "type":"ANTIQUE"}' -H "Content-Type: application/json"

{"type":"ANTIQUE","isbn":"AAAA","year":"2020"}

$> curl -X POST localhost:8080/books -d '{"isbn":"AAAA", "author":"John", "type":"SCIENCE"}' -H "Content-Type: application/json"

{"type":"SCIENCE","isbn":"AAAA","author":"John"}

相关问题