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

And*_*ili 3 java spring json spring-mvc javabeans

我正在研究可从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>
Run Code Online (Sandbox Code Playgroud)

当我单击提交按钮时,HTTP Post请求传递创建JSON对象的Jquery函数,这是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;
});
Run Code Online (Sandbox Code Playgroud)

我创建并传递的JSON对象由数据变量表示,并包含以下key\value:{\"foo \":\"bar \",\"fruit \":\"apple \"}

就像是:

foo:酒吧

水果:苹果

现在,在我的控制器中,我有处理此请求的方法:

@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 + "')";
}
Run Code Online (Sandbox Code Playgroud)

所以很明显,这个方法处理HTTP Post请求到"映射/消费"路径(只有POST请求),但我不确定以下项目的含义:

  1. consumes = MediaType.APPLICATION_JSON_VALUE:这究竟是什么意思?我认为它告诉Spring这个方法接收一个JSON格式的对象,所以它可以以某种方式解析...但我不确定它,我没有在文档中找到它.

    消费是什么?变量或类似注释的东西?我不了解事情,因为这里是@RequestMapping注释的参数,但在Google上搜索显示它被用作独立注释...

  2. 在我的byConsumes()方法中,我有以下输入参数:@RequestBody JavaBean javaBean.阅读Spring文档我理解:@RequestBody方法参数注释表明使用@RequestBody注释时,方法参数应该绑定到HTTP请求体的值.

    所以在实践中,这意味着我在我的HTTP请求主体字段中有我的JSON对象并使用这个注释我将它转换为一个名为javaBean的对象,具有类JavaBean?

    如果我的肯定是真的......什么样的对象是JavaBean类型的对象?一个只包含许多变量的对象以及相应的getter和setter方法?(在previus情况下,一个对象只包含两个变量:第一个名为foo,值为"bar",第二个名为fruit,值为"apple")

这样对吗?

非常感谢Andrea

Nia*_*son 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");
Run Code Online (Sandbox Code Playgroud)

您可以替换JavaBean为字段foo和声明getter/setter的任何其他Java类的类型fruit.