【问题标题】:Spring3 Unmarshalling XML to JavaSpring3 将 XML 解组为 Java
【发布时间】:2012-10-14 15:16:24
【问题描述】:

我无法连接所有允许从 ajax 客户端发送的 xml 被解组为 Java 对象的部分。我将 Jquery 用于 ajax 客户端、Spring3 和 JAXB。以下是关键组件:

Ajax 客户端

        function checkForNewActivities(activities) {
            $j.ajax({
                url: "upload/checkForNewActivities",
                type: "POST",
                async: true, 
                dataType: "xml",
                data: ({activities:activities}),
                contentType: "application/xml",

                beforeSend: function() {
                    alert("sending ajax");
                },
                complete: function() {
                    alert("ajax sent");
                },
                success: function(data) {
                    alert("success");
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    alert(textStatus + errorThrown);
                }
            });
        }

弹簧配置

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
          <property name="marshaller" ref="jaxbMarshaller" />
          <property name="unmarshaller" ref="jaxbMarshaller" />
          <property name="supportedMediaTypes" value="application/xml"/>
    </bean>

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
           a bunch of java classes
        </list>
    </property>
</bean>

这里是作为目标的 Spring Controller 方法:

  @RequestMapping(value="/checkForNewActivities",headers="application/xml", method=RequestMethod.POST)
  public @ResponseBody String uploadMultipleWorkouts(@RequestBody String activities) {        
      System.out.println(activities);
      return ""; 
  }

使用 RequestMapping 中的 headers="application/xml",此方法永远不会被调用。如果我删除 headers 参数,则调用该方法并将活动转储到控制台显示转义的 xml。

我显然错过了如何将此方法连接到 spring 配置,以便进行 xml 解组。

【问题讨论】:

    标签: ajax spring jaxb spring-3


    【解决方案1】:

    你的 println 打印出转义的 xml 的原因是因为变量 activities 的数据类型是 String。您需要创建一个类来保存将传递给方法的数据,以便 JAXB 可以将 xml 转换成一个结构。

    例如,而不是

    public @ResponseBody String uploadMultipleWorkouts(@RequestBody String activities) {
    

    你会想要的

    public @ResponseBody Activities uploadMultipleWorkouts(@RequestBody Activities activities) {
    

    其中Activities 是您使用适当的getter 和setter 定义的类,以便可以分配您传入的xml 数据。如果请求数据和响应数据必须不同,那么您可以简单地定义两个类,请求和响应变体。

    至于为什么使用headers="application/xml"会搞砸,尝试将其设置为headers = {"content-type=application/xml"}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      相关资源
      最近更新 更多