关于 Spring 转换器的一些信息,以及 Jaxb2RootElementHttpMessageConverter 如



我有一些关于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/xmltext/xml

您需要在控制器方法中指定响应内容类型。为此,只需将内容类型值分配给@RequestMapping批注的produces属性。

例如,可在春季文档 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html

中找到

希望这有帮助。

相关内容

最新更新