【问题标题】:JAXB Nesting a CollectionJAXB 嵌套集合
【发布时间】:2011-03-28 13:09:41
【问题描述】:

我在将 JAXB 对象集合映射到另一个 JAXB 对象时遇到问题,有人看到下面我的结构存在问题吗?我使用以下代码得到一个空的原用户 ArrayList:

 String test="<SSO-Request><User-Id>3119043033121014002</User-Id><Former-User-Ids><User-Id>3119043033121014999</User-Id><User-Id>3119043033121014555</User-Id></Former-User-Ids></SSO-Request>";
        SSORequest ssoRequest=null;
        try{
            JAXBContext jaxbContext = JAXBContext.newInstance(SSORequest.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            ssoRequest = (SSORequest) unmarshaller.unmarshal(new StringReader(test));
        }
        catch(Exception e){
            e.printStackTrace();
        }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name="SSO-Request")
    public class SSORequest {
        @XmlElement(name="User-Id")
        String userId;
        @XmlElementWrapper(name="Former-User-Ids")
        List<FormerUser> formerUsers;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name="Former-User-Ids")
    public class FormerUser {
    @XmlElement(name="User-Id")
    String userId;
}

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    您的映射过于复杂,这就是您所需要的:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name="SSO-Request")
    public class SSORequest {
    
        @XmlElement(name="User-Id")
        String userId;
    
        @XmlElementWrapper(name="Former-User-Ids")
        @XmlElement(name="User-Id")
        List<String> formerUserIds;
    }
    

    【讨论】:

      【解决方案2】:

      您应该按照 skaffman 的建议更改映射,或者更改 xml:

      <SSO-Request><User-Id>3119043033121014002</User-Id><Former-User-Ids><Former-User><User-Id>3119043033121014999</User-Id></Former-User><Former-User><User-Id>3119043033121014555</User-Id></Former-User></Former-User-Ids></SSO-Request>
      

      并更改FormerUser xml 元素的名称:

      @XmlAccessorType(XmlAccessType.FIELD)
      @XmlRootElement(name="Former-User")
      public class FormerUser {
          @XmlElement(name="User-Id")
          String userId;
       }
      

      【讨论】:

        【解决方案3】:

        如果属性应该是 List,那么您将需要一种方法来告诉 JAXB ID 对应于什么。如果FormerUsers 的数据将出现在文档中,那么您可以使用@XmlID 和@XmlIDREF 进行此映射:

        如果FormerUsers的数据将出现在文档之外,那么您可以使用我在下面的答案中描述的策略:

        【讨论】:

          猜你喜欢
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多