And*_*ili 81 java rest spring json spring-mvc
我有一个以下列方式注释的方法:
/**
* 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();
}
Run Code Online (Sandbox Code Playgroud)
所以我知道这个注释:
@RequestMapping(value="/orders", method=RequestMethod.GET)
Run Code Online (Sandbox Code Playgroud)
此方法处理对URL / orders表示的资源进行的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>();
...............................
...............................
...............................
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:究竟是如何的不的@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结果
那究竟是什么意思呢?这是否意味着List<Account>该accountSummary()方法返回的对象会自动转换为JSON格式然后放入Http Response?或者是什么?
如果这个断言为真,那么它在哪里指定对象将自动转换为JSON格式?@ResponseBody使用注释时是采用标准格式还是在其他地方指定?
JB *_*zet 142
首先,注释没有注释List.它注释方法,就像它RequestMapping一样.你的代码相当于
@RequestMapping(value="/orders", method=RequestMethod.GET)
@ResponseBody
public List<Account> accountSummary() {
return accountManager.getAllAccounts();
}
Run Code Online (Sandbox Code Playgroud)
现在注释的含义是方法的返回值将构成HTTP响应的主体.当然,HTTP响应不能包含Java对象.因此,此帐户列表将转换为适合REST应用程序的格式,通常为JSON或XML.
格式的选择取决于安装的消息转换器,RequestMapping注释的produces属性值以及客户端接受的内容类型(可在HTTP请求标头中使用).例如,如果请求表明它接受XML而不是JSON,并且安装了可以将列表转换为XML的消息转换器,则将返回XML.
Pau*_*tha 54
要理解的第一个基本要素是架构的差异.
一端你有MVC架构,它基于你的普通网络应用程序,使用网页,浏览器请求页面:
Browser <---> Controller <---> Model
| |
+-View-+
Run Code Online (Sandbox Code Playgroud)
浏览器发出请求,控制器(@Controller)获取模型(@Entity),并从模型创建视图(JSP),并将视图返回给客户端.这是基本的Web应用程序架构.
另一方面,您拥有RESTful架构.在这种情况下,没有View.Controller仅发送回模型(或资源表示,更多RESTful术语).客户端可以是JavaScript应用程序,Java服务器应用程序,以及我们将REST API公开的任何应用程序.通过这种架构,客户端决定如何处理此模型.以Twitter为例.Twitter作为Web(REST)API,允许我们的应用程序使用其API来获取状态更新等内容,以便我们可以使用它将这些数据放入我们的应用程序中.该数据将以某种格式出现,如JSON.
话虽这么说,在使用Spring MVC时,它最初是为处理基本的Web应用程序架构而构建的.可能有不同的方法签名风格允许从我们的方法生成视图.该方法可以返回ModelAndView我们显式创建它的位置,或者有隐式方法可以返回一些设置为模型属性的任意对象.但无论如何,在请求 - 响应周期的某个地方,都会产生一个视图.
但是当我们使用时@ResponseBody,我们说我们不希望产生一个视图.我们只想以我们指定的格式发送返回对象作为正文.我们不希望它成为序列化的Java对象(尽管可能).所以是的,它需要转换为其他一些常见类型(这种类型通常通过内容协商来处理 - 请参阅下面的链接).老实说,我对Spring的工作并不多,尽管我在这里和那里都涉足它.通常,我使用
@RequestMapping(..., produces = MediaType.APPLICATION_JSON_VALUE)
Run Code Online (Sandbox Code Playgroud)
设置内容类型,但也许JSON是默认值.不要引用我,但如果你得到JSON,而你没有指定produces,那么也许它是默认的.JSON不是唯一的格式.例如,上面的内容可以很容易地用XML发送,但是您需要使用producesto MediaType.APPLICATION_XML_VALUE,我相信您需要配置HttpMessageConverterfor JAXB.至于MappingJacksonHttpMessageConverter配置的JSON ,当我们在类路径上有Jackson时.
我需要一些时间来了解内容协商.这是REST的一个非常重要的部分.它将帮助您了解不同的响应格式以及如何将它们映射到您的方法.
| 归档时间: |
|
| 查看次数: |
146484 次 |
| 最近记录: |