我有一些关于Spring MVC消息转换器使用的问题。
如果我有以下情况:
在我看来,我有以下链接:
<a id="writeXmlAccept" class="writeXmlLink" href="<c:url value="/messageconverters/xml" />">Write XML via Accept=application/xml</a>
此链接生成指向 URL 的 HTTP 请求:"/messageconverters/xml">
与此链接的点击事件相关,具有class="writeXmlLink">我有以下Jquery回调函数:
$("a.writeXmlLink").click(function() {
/* Variabile che contiene il riferimento all'elemento nel DOM che ha
scatenato l'evento click (il link clickato) */
var link = $(this);
// Viene eseguita la chiamata ajax
$.ajax({
// Indirizzo verso cui è indirizzata la richiesta
url: link.attr("href"),
/* Prima di inviare l'HTTP Request esegui la funzione passandogli il
parametro req che rappresenta l'HTTP Request */
beforeSend: function(req) {
// Se l'url termina con .xml
if (!this.url.match(/.xml$/)) {
// Aggiunge alla HTTP Request l'header Accept: application/xml
req.setRequestHeader("Accept", "application/xml");
}
},
success: function(xml) { // Caso di successo:
MvcUtil.showSuccessResponse(MvcUtil.xmlencode(xml), link);
},
error: function(xhr) { // Caso di errore:
MvcUtil.showErrorResponse(xhr.responseText, link);
}
});
return false;
});
由于 URL "/messageconverters/xml"> 不以 *.xml 模式结尾,因此不会执行if
正文,并且不会在此请求中设置 Accept
标头
好的,所以这个函数只执行我的 HTTP 请求的 ajax 调用并等待响应。
我的控制器类处理此 HTTP 请求的方法如下:
/* Metodo che gestisce HTTP Request di tipo GET dirette verso
* l'URL: "/messageconverters/xml" */
@RequestMapping(value="/xml", method=RequestMethod.GET)
public @ResponseBody JavaBean writeXml() {
return new JavaBean("bar", "apple");
}
此方法仅创建并返回一个新的 JavaBean 对象,以评估其 tow 属性
JavaBean 是我示例中的一类,它只有 2 个属性,getter 和 setter 方法以及 toString(( 方法,这个:
@XmlRootElement
public class JavaBean {
@NotNull
private String foo;
@NotNull
private String fruit;
public JavaBean() {
}
public JavaBean(String foo, String fruit) {
this.foo = foo;
this.fruit = fruit;
}
// GETTER & SETTER & toString()
}
因此,增值的 JavaBean 对象返回到客户端(浏览器(,在我的视图中显示以下输出:
<javaBean><foo>bar</foo><fruit>apple</fruit></javaBean>
在这个例子中,我会很好地理解转换器何时以及如何工作:
我认为使用的转换器是Jaxb2RootElementHttpMessageConverter
因为我正在我的视图中编写一个 XML 代码,并且因为我的 JavaBean 类是使用@XmlRootElement
注释进行注释的,该注释是一个 JAXB 注释,实现了 Java 类和 XML 字段之间的映射。
那么,当我点击我的链接时会发生什么?
创建有价值的JavaBean对象,当我返回它时(在HTTP响应的正文字段中(,这个JavaBean对象被Jaxb2RootElementHttpMessageConverter转换为XML文档?
谢谢
使用 FireBug 等工具,查看确切的请求和响应标头。这将使事情变得更容易。
我怀疑响应没有正确的内容类型或 MIME 类型,即它应该是application/xml
或text/xml
。
您需要在控制器方法中指定响应内容类型。为此,只需将内容类型值分配给@RequestMapping
批注的produces
属性。
例如,可在春季文档 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html
中找到希望这有帮助。