1

在带有 Dropwizard(带有 Jackson 和 Hibernate)的图书库系统中,有以下类:

@Entity
@Table(name="author")
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name="name")
    private string name;
    // some more properties
}

@Entity
@Table(name="book")
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name="title")
    private string title;
    // some more properties
}

@POST
public void addBook(Book book) {
    ...
}

要添加一本书,书名和作者 ID 应作为 json 对象发送。

{"title": "Harry Potter", "author": "123"}

但是,杰克逊似乎无法让作者脱离给定的作者 ID。

Error 400 Can not instantiate value of type [simple type] from Integral number; no single-int-arg constructor/factory method (through reference chain)

有没有办法配置从请求的 JSON 到书籍对象以及从 authorId 到作者的映射,而无需创建像这样的临时对象

class TempBook { string title; long authorId; }
4

1 回答 1

2

您的 Book 实体没有“作者”属性。所以杰克逊将无法将您的 JSON 编组/解组到实际的 Book 实例。我能想到的一种方法是通过 setter/getters 辅助方法,如下所示:

@OneToOne private Author authorEntity;
public void setAuthor(String author) { this.autorEntity = new Author(author);}

但是您必须考虑为编组过程添加适当的 getter,并为属性使用@JsonIgnoreProperties注释。authorEntity

希望这可以帮助。

于 2014-05-27T04:23:23.443 回答