【问题标题】:jaxb Unmarshaller : repeated xmlelement without wrapperjaxb Unmarshaller:没有包装器的重复 xmlelement
【发布时间】:2012-10-27 05:33:57
【问题描述】:
<a>
    <b1>b1</b1>
    <b2>b2</b2>
    <b3>
        <c1></c1>
        <c2></c2>
    </b3>
    <b3>
        <c1></c1>
        <c2></c2>
    </b3>
    <b3>
        <c1></c1>
        <c2></c2>
    </b3>
</a>

由于所有&lt;b3&gt; 不包含在包装元素中,例如&lt;b3s&gt;,当我使用Jackson XmlMapper 将XML 文件读取到我的POJO Java Bean 类时,我得到了异常

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.xxxxx] from String value; no single-String constructor/factory method (through reference chain: com.xxxx["xxx"]->com.xxx["xxx"])

我应该使用什么注释?

@XmlElement
public List<B3> b3;

【问题讨论】:

    标签: jaxb jackson


    【解决方案1】:

    如果要使用“unwrapped”表示,则需要使用Jackson 2.1,并注明unwrapped选项:

    @JacksonXmlElementWrapper(useWrapping=false)
    

    或者,如果使用 JAXB 注解,则默认不使用包装。

    最后,您还可以更改默认不使用包装元素,使用:

    JacksonXmlModule module = new JacksonXmlModule();
    // to default to using "unwrapped" Lists:
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);
    

    【讨论】:

      【解决方案2】:

      注意

      Jackson 不是符合 JAXB (JSR-222) 的实现。这意味着无法保证它如何解释标准 JAXB 注释


      默认情况下,符合JAXB (JSR-222) 的实现不会将包装元素应用于集合属性。

      一个

      默认情况下,JAXB (JSR-222) 实现将默认基于属性的映射。为了节省空间,我省略了这些方法并指定了@XmlAccessorType(XmlAccessType.FIELD),以便元数据将从实例变量(字段)派生。

      package forum13097559;
      
      import java.util.List;
      import javax.xml.bind.annotation.*;
      
      @XmlRootElement
      @XmlAccessorType(XmlAccessType.FIELD)
      public class A {
      
          private String b1;
          private String b2;
          private List<B3> b3;
      
      }
      

      B3

      package forum13097559;
      
      import javax.xml.bind.annotation.*;
      
      @XmlAccessorType(XmlAccessType.FIELD)
      public class B3 {
      
          private String c1;
          private String c2;
      
      }
      

      演示

      package forum13097559;
      
      import java.io.File;
      import javax.xml.bind.*;
      
      public class Demo {
      
          public static void main(String[] args) throws Exception {
              JAXBContext jc = JAXBContext.newInstance(A.class);
      
              Unmarshaller unmarshaller = jc.createUnmarshaller();
              File xml = new File("src/forum13097559/input.xml");
              A a = (A) unmarshaller.unmarshal(xml);
      
              Marshaller marshaller = jc.createMarshaller();
              marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              marshaller.marshal(a, System.out);
          }
      
      }
      

      input.xml/Output

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <a>
          <b1>b1</b1>
          <b2>b2</b2>
          <b3>
              <c1></c1>
              <c2></c2>
          </b3>
          <b3>
              <c1></c1>
              <c2></c2>
          </b3>
          <b3>
              <c1></c1>
              <c2></c2>
          </b3>
      </a>
      

      更多信息

      【讨论】:

        【解决方案3】:

        Jackson 不知道如何将字符串转换为B3 的实例。添加一个构造函数(或返回B3 的工厂方法)到B3,它接受一个String。构造函数示例:

        class B3 {
            // ...
            public B3(String value) {
               // do something with value 
            }
            // ...
        }
        

        http://wiki.fasterxml.com/JacksonFeatureCreators

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-07
          • 1970-01-01
          相关资源
          最近更新 更多