【问题标题】:Some information about Spring converters and how Jaxb2RootElementHttpMessageConverter work in Spring MVC关于 Spring 转换器以及 Jaxb2RootElementHttpMessageConverter 如何在 Spring MVC 中工作的一些信息
【发布时间】:2013-01-15 17:21:09
【问题描述】:

我有一些关于 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 注释进行注释,这是一个 JAXB 注释,它实现了Java 类和 XML 字段之间的映射。

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

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

谢谢

【问题讨论】:

    标签: java spring spring-mvc converter


    【解决方案1】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2018-08-15
      • 2016-05-01
      • 1970-01-01
      相关资源
      最近更新 更多