java Spring @ResponseBody annotation是如何工作的?

t0ybt7op  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(150)

我有一个方法,它以如下方式注解:

/**
* 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**/orders表示的资源发出的GETHTTP请求。
该方法调用一个DAO对象,返回一个
List**。
其中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中?还是什么?
如果此Assert为真,在哪里指定对象将自动转换为JSON?是使用@ResponseBody注解时采用的标准格式还是在其他地方指定的格式?

btqmn9zl

btqmn9zl1#

首先,注解并没有注解List。它注解了方法,就像RequestMapping一样。

@RequestMapping(value="/orders", method=RequestMethod.GET)
@ResponseBody
public List<Account> accountSummary() {
    return accountManager.getAllAccounts();
}

注解的意思是,方法的返回值将构成HTTP响应的主体。当然,HTTP响应不能包含Java对象。因此,此帐户列表将转换为适合REST应用程序的格式,通常是JSON或XML。
格式的选择取决于安装的消息转换器、@RequestMapping注解的produces属性的值以及客户端接受的内容类型例如,如果请求说它接受XML,但不接受JSON,并且安装了可以将列表转换为XML的消息转换器,则XML将被返回。

vmdwslir

vmdwslir2#

首先要了解的基本问题是体系结构的差异。
一方面,你有MVC架构,它基于你的普通Web应用程序,使用网页,浏览器请求一个页面:

Browser <---> Controller <---> Model
               |      |
               +-View-+

浏览器发出请求,控制器(@Controller)获取模型(@Entity),并从模型创建视图(JSP),然后将视图返回给客户端。这是基本的Web应用程序架构。
在另一端,你有一个RESTful架构,在这种情况下,没有视图,控制器只发回模型(或资源表示,用更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)

设置内容类型,但可能JSON是默认的。不要引用我的话,但如果你得到JSON,并且你没有指定produces,那么它可能是默认的。JSON不是唯一的格式。例如,上面可以很容易地以XML发送,但是你需要有producesMediaType.APPLICATION_XML_VALUE,我相信你需要为JAXB配置HttpMessageConverter。至于JSON MappingJacksonHttpMessageConverter,当我们在类路径上有Jackson时。
我会花一些时间来学习Content Negotiation。它是REST中非常重要的一部分。它将帮助您了解不同的响应格式以及如何将它们Map到您的方法。

khbbv19g

khbbv19g3#

除此之外,返回类型由

  1. HTTP请求在它的Accept头中说它想要什么。尝试查看初始请求,看看Accept被设置为什么。
  2. Spring设置了什么HttpMessageConverters。如果Jackson库在classpath上,Spring MVC将为XML(使用JAXB)和JSON设置转换器。
    如果有一个选择,它会选择一个--在这个例子中,它碰巧是JSON。
    这在课程笔记中有涉及。请查找有关消息转换器和内容协商的笔记。
fwzugrvs

fwzugrvs4#

@RequestBody annotation将HTTPRequest body绑定到域对象。Spring使用HttpMessageConverters自动将传入的HTTP Request反序列化为对象。HttpMessageConverter转换请求的body以根据请求的内容类型解析方法参数。如何使用转换器https://upcodein.com/search/jc/mg/ResponseBody/page/0的许多示例

hrysbysz

hrysbysz5#

我想包括有关以下内容的其他信息:
如何从响应体的Angular 来配置消息转换器?通过HttpMessageCoverter接口来处理响应的序列化。Sping Boot 提供了几个内置的消息转换器,用于处理JSON和XML等数据格式。您也可以创建自定义消息转换器来处理其他数据格式。

相关问题