我有一些关于 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
此请求中未设置 header
好的,所以这个函数只执行我的 HTTP 请求的 ajax 调用并等待响应。
我的 Controller 类处理此 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 对象,并验证其两个属性
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 对象将返回给客户端(浏览器),并在我的 View 中显示以下输出:
<javaBean><foo>bar</foo><fruit>apple</fruit></javaBean>
我会很好地理解转换器在这个例子中何时以及如何工作:
我认为使用的转换器是Jaxb2RootElementHttpMessageConverter
,因为我在 View 中编写XML代码,并且因为我的JavaBean类使用@XmlRootElement进行注释
注释,它是一个 JAXB 注释,用于实现 Java 类和 XML 字段之间的映射。
那么,当我点击链接时会发生什么?
创建了经过验证的 JavaBean 对象,当我返回它时(在 HTTP 响应的正文字段内),该 JavaBean 对象会被 Jaxb2RootElementHttpMessageConverter 转换为 XML 文档?
谢谢
最佳答案
使用 FireBug 等工具查看确切的请求和响应 header 。这会让事情变得更容易。
我怀疑响应没有正确的内容类型或 MIME 类型,即它应该是 application/xml
或 text/xml
。
您需要在 Controller 方法中指定响应内容类型。为此,只需将内容类型值分配给 @RequestMapping
注释的 products
属性即可。
例如可在 spring 文档 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html 中找到
希望这有帮助。
关于java - 有关 Spring 转换器以及 Jaxb2RootElementHttpMessageConverter 如何在 Spring MVC 中工作的一些信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343206/