在这个RESTful应用程序示例中,Spring @ResponseBody注释如何工作?
我有一个方法是以下列方式注释的:
/** * Provide a list of all accounts. */ // TODO 02: Complete this method. Add annotations to respond // to GET /accounts and return a List<Account> to be converted. // Save your work and restart the server. You should get JSON results when accessing // http://localhost:8080/rest-ws/app/accounts @RequestMapping(value="/orders", method=RequestMethod.GET) public @ResponseBody List<Account> accountSummary() { return accountManager.getAllAccounts(); }
所以我知道通过这个注释:
@RequestMapping(value="/orders", method=RequestMethod.GET)
这个方法处理对由URL /订单表示的资源所做的GET HTTP请求。
这个方法调用一个返回List的DAO对象。
其中Account代表系统上的用户,并且有一些代表这个用户的字段,如:
public class Account { @Id @Column(name = "ID") @GeneratedValue(strategy=GenerationType.IDENTITY) private Long entityId; @Column(name = "NUMBER") private String number; @Column(name = "NAME") private String name; @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name = "ACCOUNT_ID") private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>(); ............................... ............................... ............................... }
我的问题是: @ResponseBody
注释如何工作?
它位于返回的List<Account>
对象之前,所以我认为它引用了这个List。 课程文档指出,该注释用于:
确保结果将被HTTP消息转换器(而不是MVC视图)写入HTTP响应。
并阅读官方的Spring文档: http : //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html
它似乎将List<Account>
对象,并将其放入Http Response
。 这是正确的还是我误解?
写入以前accountSummary()
方法的注释中有:
访问http:// localhost:8080 / rest-ws / app / accounts时,您应该获得JSON结果
那么究竟是什么意思呢? 这是否意味着accountSummary()
方法返回的List<Account>
对象会自动转换为JSON
格式,然后放入Http Response
? 或者是什么?
如果这个断言是真的,它在哪里指定对象将被自动转换成JSON
格式? 当使用@ResponseBody
注解或在其他地方指定时,是采用的标准格式?
首先,注释不会注释List
。 它注释了这个方法,就像RequestMapping
一样。 你的代码相当于
@RequestMapping(value="/orders", method=RequestMethod.GET) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
现在注解的含义是方法的返回值将构成HTTP响应的主体。 当然,HTTP响应不能包含Java对象。 所以这个账户列表被转换成适合于REST应用的格式,通常是JSON或者XML。
格式的select取决于安装的消息转换器,RequestMapping批注的produce 属性的值以及客户端接受的内容types(可在HTTP请求标头中find)。 例如,如果请求声明它接受XML而不是JSON,并且安装了可以将列表转换为XML的消息转换器,则将返回XML。
要理解的第一个基本的东西是架构的差异。
一方面,你有MVC架构,这是基于你的正常的networking应用程序,使用网页,浏览器请求一个页面:
Browser <---> Controller <---> Model | | +-View-+
浏览器发出请求,控制器(@Controller)获取模型(@Entity),并从模型创build视图(JSP),并将视图返回给客户端。 这是基本的networking应用程序架构。
另一方面,你有一个RESTful架构。 在这种情况下,没有View。 控制器只发回模型(或资源表示,更多的RESTful条款)。 客户端可以是JavaScript应用程序,Java服务器应用程序,我们将REST API公开到的任何应用程序。 有了这个架构,客户决定如何处理这个模型。 以Twitter为例。 Twitter作为Web(REST)API,允许我们的应用程序使用其API来获取状态更新等信息,以便我们可以使用它将这些数据放入我们的应用程序中。 这些数据将以某种格式如JSON。
这就是说,在使用Spring MVC时,它首先被构build来处理基本的Web应用程序体系结构。 可能有不同的方法签名风格,允许从我们的方法中产生视图。 该方法可以返回一个ModelAndView
,我们明确地创build它,或者有隐式的方式,我们可以返回一些被设置为模型属性的任意对象。 但无论哪种方式,在请求 – 响应周期的某个地方,都会产生一个观点。
但是当我们使用@ResponseBody
,我们说我们不希望产生一个视图。 我们只是想以我们指定的任何格式发送返回对象作为主体。 我们不希望它是一个序列化的Java对象(尽pipe可能)。 所以是的,它需要转换成其他一些常见的types(这种types通常是通过内容协商处理的 – 请参阅下面的链接)。 老实说,我和spring不太一样,尽pipe我在这里和那里都有涉猎。 通常,我使用
@RequestMapping(..., produces = MediaType.APPLICATION_JSON_VALUE)
设置内容types,但也许JSON是默认的。 不要引用我,但是如果你得到JSON,并且你没有指定produces
,那么也许它是默认的。 JSON不是唯一的格式。 例如,上面的代码可以很容易地用XML发送,但是你需要将produces
放到MediaType.APPLICATION_XML_VALUE
,我相信你需要为JAXBconfigurationHttpMessageConverter
。 至于JSON MappingJacksonHttpMessageConverter
configuration,当我们在类path上有Jackson。
我会花一些时间来了解内容协商 。 这是REST非常重要的一部分。 这将帮助您了解不同的响应格式以及如何将它们映射到您的方法。
正如JB Nizet所提到的,
@RequestMapping(value="/orders", method=RequestMethod.GET) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
和
@RequestMapping(value="/orders", method=RequestMethod.GET) public @ResponseBody List<Account> accountSummary() { return accountManager.getAllAccounts(); }
两者都是一样的。 因为@ResponseBody注释的方法不是列表。 这里可以使用@GMsoF -Installed消息转换器,如下所示。
@RequestMapping(value="/orders", method=RequestMethod.GET , produces={"application/json","application/xml"}) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
谢谢 :)
除此之外,返回types由确定
-
HTTP Request要求的内容 – 在Accept头中。 尝试查看最初的请求,看看什么接受设置。
-
什么HttpMessageConverters弹簧设置。 如果Jackson库位于类path上,Spring MVC将为XML(使用JAXB)和JSON设置转换器。
如果有select,select一个 – 在这个例子中,它恰好是JSON。
这在课程笔记中已经介绍过了。 查找消息转换器和内容协商的注释。