Spring @ResponseBody注释如何在这个RESTful应用程序示例中工作?

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.

  • 嗨,我们如何设置"已安装的消息转换器"?我希望默认值始终转换为Json.我能做到吗? (3认同)
  • @ Er.NavedAli读取http规范,http响应内容类型定义http响应可以包含的合法内容.合法的值可以是"application/octet-stream","image/jpeg","text/HTML",但java对象不是合法的值. (3认同)

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的一个非常重要的部分.它将帮助您了解不同的响应格式以及如何将它们映射到您的方法.