有人可以澄清@RequestBody

时间:2016-09-20 12:42:35

标签: java spring spring-mvc

我已经对@RequestBody进行了一些阅读和研究,但我仍然无法围绕它的目的包裹我的头脑。

鉴于情景:

  • RESTful API仅从用户获取bookName并返回该书的authorName
  • @RequestBody方法添加了getAuthor注释,该方法以bookName为参数。

从我在similar回答的问题中读到的内容,这在这种情况下如何应用?将A转换为B然后将B转换为A是什么意思,以便用户可以将其视为JSON对象。我很困惑!

1 个答案:

答案 0 :(得分:4)

来自javadoc:

  

指示方法参数的注释应绑定到正文   的网络请求。请求的主体通过   HttpMessageConverter根据需要解析方法参数   请求的内容类型。可选地,可以进行自动验证   通过使用@Valid注释参数来应用。

在您的示例中,使用@RequestBody毫无意义。您希望获得与书籍相对应的作者姓名

您发送GET /books/myBook/author

控制器将是

@RestController
public class BooksRestController{

    @RequestMapping(value="/books/{bookName}/author", method=RequestMethod.GET)
    public Map<String,String> getAuthor(@PathVariable bookName){
        ...
        Map<String,String> author = new HashMap<String,String>();
        author.put("author",bookAuthor);
        return author;
    }
}

回复为{"author":"whoever"}

现在想象你想要创作一本书。您可以使用@RequestBody自动将HTTP POST正文中发送的JSON解析为Book对象。

请求:POST /books - 正文{"name" : "SomeBook", "author":"SomeAuthor"}

<强>控制器:

@RestController
public class BooksRestController{

    @RequestMapping(value="/books", method=RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public Book createBook(@RequestBody Book book){
        ...
        //save book
        book = bookService.save(book);
        return book;
        //Book is going to be serialized as JSON because of the implicit 
        //@ResponseBody annotation from @RestController
    }

Book.class:

public class Book{
    private String name;
    private String author;
    //getters setters;
}