java - 有关 Spring 转换器以及 Jaxb2RootElementHttpMessageConverter 如何在 Spring MVC 中工作的一些信息

标签 java spring spring-mvc converters

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

相关文章:

java - Spring @RestController 是否默认启用 CORS?

java - 在 Spring Boot 中将生成的报告作为电子邮件附件发送

java - JSF 组件 - IN : pick file from server; OUT: file path only

Java 将参数传递给 Python 脚本

java - 两个 Spring JUnit 测试类 : InstanceAlreadyExistsException when @TestPropertySource value differs

java - Spring Boot 服务层单元测试中模拟原始字符串

java - 将操作添加到 JDialog 中动态创建的按钮

java - 按时区在 DatePicker 中设置 "today date"(Android)

java - 使用 jUnit 进行 Spring Hibernate 存储库测试

java - Spring Security 3.2 Java配置