在SpringMVC中将JSON对象绑定到JavaBean类,我有一些事情不清楚
在此期间,我正在学习SpringMVC展示示例 关于请求映射,我有点怀疑,我有以下情况: 在我提交表单的视图中,提交此表单将启动以下Jquery功能:在SpringMVC中将JSON对象绑定到JavaBean类,我有一些事情不清楚,java,json,spring,spring-mvc,jaxb,Java,Json,Spring,Spring Mvc,Jaxb,在此期间,我正在学习SpringMVC展示示例 关于请求映射,我有点怀疑,我有以下情况: 在我提交表单的视图中,提交此表单将启动以下Jquery功能: $("form.readJsonForm").submit(function() { var form = $(this); // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento sub
$("form.readJsonForm").submit(function() {
var form = $(this); // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento submit (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 tath 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格式的JavaScript对象:
{\'foo\':'bar\','fruit\':'apple\'}
好的,然后我的Jquery函数执行一个AJAX调用,并将我的JSON对象发送到Spring控制器类
这是处理此HTTP请求的方法:
@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
System.out.println("foo: " + javaBean.getFoo() + " fruit: " + javaBean.getFruit());
return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}
此方法处理指向URL的HTTP POST请求:“/mapping/consumes”并使用JSON对象(由consumes=MediaType.APPLICATION\u JSON\u VALUE指定)
Ok此方法获取一个输入参数,该参数使用@RequestBody注释进行注释,该注释指示我的方法参数应绑定到HTTP请求主体(我的JSON对象)中的值
JavaBean类仅包含以下两个属性:
private String foo;
private String fruit;
(作为JSON对象属性)
要将JSON对象属性与JavaBean属性绑定,JavaBean类由@XmlRootElement注释注释:
包org.springframework.samples.mvc.mapping
导入javax.xml.bind.annotation.XmlRootElement
@XmlRootElement
public class JavaBean {
private String foo = "bar";
private String fruit = "apple";
// Setter and Getter method for properties
现在我知道,当您在Spring控制器中的对象上看到@RequestBody注释时,@RequestMapping注释的consumes属性是“application/xml”(或Spring 3.1之前的版本),内容类型头设置为“application/xml”)这将告诉Spring请求消息的有效负载是XML,需要将其解组到用@RequestBody注释的对象。在这种情况下,使用@RequestBody注释的对象通常会使用JAXb注释对其本身进行注释,以提供将该对象封送到XML或从XML中解封所需的元数据,@XmlRootElement是提供该元数据的注释之一
好的,这对我来说已经很清楚了……我唯一的疑问是,在我的@RequestMapping注释中,我没有将内容类型头设置为“application/xml,但我有:consumes=MediaType.application\u JSON\u VALUE
所以我有一个问题要问你:
1) 内容类型标题和消费=MediaType.APPLICATION\u JSON\u值
2) 根据我对**@XmlRootElement**文档的理解:
此注释提供了XML内容和JAVA内容之间的双向关联。
因此,我可以在Java类属性中映射XML字段的内容,反之亦然
问题是,在本例中,我没有XML“对象”,但我使用的是一个JSON对象,它是XML的替代品!!!我缺少什么
多谢各位
安德里亚首先回答你的问题: Content-Type头和consumes=MediaType.APPLICATION\u JSON\u值之间有什么区别 它们都定义了内容类型,但用于不同的目的
- 内容类型头是HTML规范的一部分;它是作为HTML消息头的一部分传输的属性,该消息头告诉接收方正在传输的数据有效负载的格式
- “消费”“Spring控制器上使用的注释提供了一种机制来限制控制器将接受的内容类型。通过将控制器设置为
,您告诉控制器只接受来自调用者的消息,这些调用者指定他们正在向其发送JSON格式的有效负载。这意味着您需要确保您的客户机代码指定了“application/json”的内容类型,但根据您的示例代码,它似乎已经正确设置。(请注意,consumes注释与方法的内容类型相匹配,而不是“限制”它们,但出于您问题的目的,我正在简化内容。有关更多信息,请参阅链接。)consumes=MediaType.APPLICATION\u JSON\u VALUE
,其中包括spring MVC中JSON和/或XML编组/解编所需的Jackson支持(即确保Jackson位于您的类路径上)。有关详细信息,请参阅
我还将删除@XmlRootElement
标记,因为它用于XML编组/解编,在使用JSON通信时不需要它。(应该忽略它,但如果真的不需要,我会放弃它)
最后,我不确定您是在问题中还是在实际代码中使用类名“JavaBean”来进行说明,但是如果您在代码中使用这个名称,我建议更改名称。术语“JavaBean”已经在Java中的多个地方使用过,如果类的名称相同,可能会造成混淆。通过指定
contentnegotingviewresolver
bean(查找),从同一URL端点生成XML和JSON是很常见的。因此,正如Bionic_Geek所说,XML注释用于XML编组,但JSON编组不需要XML注释。