Spring REST(Jersey)与ManyToOne的关系

时间:2016-02-19 08:23:36

标签: java spring rest jersey jackson

我想通过Spring Jersey REST发布一对相关对象。

两个对象(作为示例):

public class Library {
    @Id
    private long id;

    private String name;

    @OneToMany(mappedBy="library")
    private List<Book> books;
}

图书

public class Book {
    @Id
    private long id;

    private String title;

    @ManyToOne(optional = false)
    private Library library;
}

http://localhost/book/72显示

{"id": 72, "title": "my book"}

http://localhost/library/36显示

{"id": 36, "name": "our library"}

现在我的最终用户希望在图书馆之间移动图书。所以,对我而言,首先要显示书籍与图书馆之间的关系似乎很有用:

http://localhost/book/72显示

{"id": 72, "title": "my book", "libraryId": 36}

然后用户可以在http://localhost/book/72

上投放
{"id": 72, "title": "my book", "libraryId": 12}

用户在图书馆36和12之间移动了书。

这是Spring REST + Jersey的正常情况吗? 如何做到这一点?

通常 @ManyToOne 会被忽略(@ JsonIgnore),以防止:

  

{“id”:72,“title”:“我的书”,“图书馆”:{“id”:36,“name”:“我们的   库“}}

我的问题是:

问题1:如何以最简单的形式获取此'libraryId'属性?

问题2:如何在PUT / POST时将其翻译回来?

1 个答案:

答案 0 :(得分:0)

您需要添加虚拟属性;

@JsonIgnore
@ManyToOne(optional = false)
private Library library;

public Long getLibraryId() {
     library.getId();
}

public void setLibraryId(Long id) {
     library.setId(id);
}

如果您将Jackson添加到pom中,如果您使用RestController注释,则会自动生成JSON

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.1-1</version>
</dependency>

这是一个春天的例子,不是泽西岛,但你明白了,杰克逊只需要在类路径中。

@RequestMapping(value = "/book", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public  @ResponseBody  Long update(@RequestBody Book book) {
        return ...
    }