Как разрешить внешние ключи из объекта JSON с помощью Джексона

В системе книжной библиотеки с 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) {
    ...
}

Чтобы добавить книгу, название книги и идентификатор автора должны быть отправлены в виде объекта json.

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

Однако похоже, что Джексон не может вывести автора из заданного идентификатора автора.

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; }

person Explicat    schedule 25.05.2014    source источник


Ответы (1)


В объекте "Книга" нет свойства "автор". Таким образом, Джексон не сможет маршаллировать/демаршалировать ваш JSON в/из реального экземпляра книги. Способ, о котором я могу думать, - это вспомогательные методы setter/getters, что-то вроде этого:

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

Но вам придется подумать о добавлении подходящего геттера для процесса сортировки и использовании аннотации @JsonIgnoreProperties для свойства authorEntity.

Надеюсь это поможет.

person megathor    schedule 27.05.2014