如何在Spring MVC中映射JSON对象?

3
我正在学习从di STS仪表板下载的Spring MVS Showcase。我正在研究Spring如何映射请求,并且我对以下内容有些困惑:
我有一个带有提交按钮的表单:
        <li>
            <form id="byConsumes" class="readJsonForm" action="<c:url value="/mapping/consumes" />" method="post">
                <input id="byConsumesSubmit" type="submit" value="By consumes" />
            </form>
        </li>

当我点击提交按钮时,一个创建JSON对象的JQuery函数通过HTTP Post请求传递,以下是JQuery函数的代码:
$("form.readJsonForm").submit(function() {          

    var form = $(this);                 // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento click (il form) 
    var button = form.children(":first");       // Seleziona il bottone submit 

    var data = form.hasClass("invalid") ?       // OPERATORE CONDIZIONALE: il form ha classe "invalid" ? 
            "{ \"foo\": \"bar\" }" :            // SI: foo = bar 
            "{ \"foo\": \"bar\", \"fruit\": \"apple\" }";   // NO: foo= bar ; fruit = apple 


    /* AJAX CALL PARAMETER:
       type: Say to the servlet path, the request is a POST HTTP Request
       url: The address to which to send the call   
       data: the content of my data variable
       contentType: an object having JSON format
       dataType: the type of content returned by the server
    */
    $.ajax({ type: "POST", url: form.attr("action"), data: data, contentType: "application/json", dataType: "text", 
        success: function(text) { MvcUtil.showSuccessResponse(text, button); }, 
        error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});

    return false;
});

我创建并传递的JSON对象由数据变量表示,并包含以下键值对:{ \"foo\": \"bar\", \"fruit\": \"apple\" } 类似于: foo: bar fruit: apple 现在,在我的控制器中,我有处理此请求的方法:
@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
    return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}

对我来说,这种方法很清晰地处理了面向“映射/消耗”路径的HTTP Post请求(仅限POST请求),但是以下内容的含义我不太确定:

  1. consumes=MediaType.APPLICATION_JSON_VALUE: 这到底意味着什么?我认为它告诉Spring该方法接收一个JSON格式的对象,因此可以以某种方式解析...但我不确定,并且在文档中没有找到相关信息。

    consumes是什么?是变量还是注释之类的东西?我不理解这些,因为这是@RequestMapping注释的参数,但在谷歌上搜索时,它被用作独立的注释...

  2. 在我的byConsumes()方法中,我有以下输入参数:@RequestBody JavaBean javaBean。 根据Spring文档,我理解:@RequestBody方法参数注释指示使用@RequestBody注释将方法参数绑定到HTTP请求体的值。

    那么实际上,这意味着什么呢?我的JSON对象在HTTP请求体字段中,使用此注释将其转换为名为javaBean的对象,其类为JavaBean吗?

    如果我的判断是正确的...JavaBean类型的对象是什么类型的对象?只包含一些变量及其对应的getter和setter方法的对象吗?(在先前的案例中,一个仅包含两个变量的对象:第一个名为foo,其值为"bar",另一个名为fruit,其值为"apple")

是这样的吗?

非常感谢 Andrea

1个回答

8

您对这段代码的解释基本上是正确的。

'Consumes' 是注解 @RequestMapping 的一个参数,用于声明方法处理的 HTTP 内容类型。在本例中,它表示 Spring 应该将输入解析为 JSON 格式。您可以在 Spring 文档 这里 了解更多信息。类似地,您也可以声明接受 XML 格式。

@RequestBody 注解用于指示带注解的方法参数应从 HTTP 请求的正文中构建。其文档位于此处。Spring 通常会通过获取请求中的 HTTP 参数名称并使用 setter 方法将值设置到 Java bean 中来实现此操作。

在您的示例中,Spring 将检查方法的注解,并确定请求正文应映射到类型为 JavaBean 的对象。它将自动创建该类的实例,并通过消息转换器填充 JavaBean 实例。Spring 将使用反射来完成所有这些操作,但它执行的代码本质上会执行以下操作:

JavaBean parameter = new JavaBean();
parameter.setFoo("bar");
parameter.setFruit("apple");

您可以将JavaBean类型替换为声明具有foofruit字段的getter/setter的任何其他Java类。


非常感谢您的出色解释!!!现在我完全明白了 :-) - AndreaNobili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接