0

我有一些关于 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 对象,以评估它的两个属性

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注释进行注释,该注释是实现 Java 类和 XML 字段之间映射的 JAXB 注释。

那么,当我点击我的链接时会发生什么?

创建了增值的 JavaBean 对象,当我返回它时(在 HTTP 响应的主体字段内),这个 JavaBean 对象由 Jaxb2RootElementHttpMessageConverter 转换为 XML 文档?

谢谢

4

1 回答 1

1

使用 FireBug 之类的工具,查看确切的请求和响应标头。它会让事情变得更容易。

我怀疑响应没有正确的内容类型或 MIME 类型,即它应该是application/xmltext/xml

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

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

希望这可以帮助。

于 2013-04-19T12:56:43.197 回答