当前位置: 首页 > 面试题库 >

使用JaxB编组实现公共接口的对象列表

缑修齐
2023-03-14
问题内容

我正在尝试整理实现公共接口的对象列表。涉及3个类和1个接口:

社区 类(具有一种方法: List getPeople();

人员 接口(具有一种方法: String getName();

女生 班(实施人员)

男生 班(实施人员)

请参见下面的代码。

我想要一个看起来像这样的XML:

<community>
  <people>
    <girl>
      <name>Jane</name>
    </girl>
    <boy>
      <name>John</name>
    </boy>
    <girl>
      <name>Jane</name>
    </girl>
    <boy>
      <name>John</name>
    </boy>
  </people>
</community>

或可能:

<community>
  <people>
   <person>
      <girl>
        <name>Jane</name>
      </girl>
    </person>
    <person>
      <boy>
        <name>John</name>
      </boy>
    </person>
  </people>
</community>

到目前为止,我得到的是:

<community>
    <people>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
            <name>Jane</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
            <name>John</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="girl">
            <name>Jane</name>
        </person>
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="boy">
            <name>John</name>
        </person>
    </people>
</community>

我意识到我可以将元素更改为其他名称,但是我希望元素名称成为在Girl或Boy类中特殊化的名称。

能做到吗?谢谢。

@XmlRootElement(name = "community")
public class Community {

 private List<Person> people;

 @XmlElementWrapper
 @XmlElement(name="person")
 public List<Person> getPeople() {
  return people;
 }

 public Community() {
  people = new ArrayList<Person>();
  people.add(new Girl());
  people.add(new Boy());
  people.add(new Girl());
  people.add(new Boy());
 }
}







@XmlRootElement(name = "girl")
public class Girl implements Person {

 @XmlElement
 public String getName() {
  return "Jane";
 }
}


@XmlRootElement(name = "boy")
public class Boy implements Person {

 @XmlElement
 public String getName() {
  return "John";
 }
}



@XmlJavaTypeAdapter(AnyTypeAdapter.class)
public interface Person {
 public String getName();
}



public class AnyTypeAdapter extends XmlAdapter<Object, Object> {

 @Override
   public Object marshal(Object v) throws Exception {
    return v;
   }

 @Override
   public Object unmarshal(Object v) throws Exception {
    return v;
   }

}

问题答案:

对于这种情况,我建议使用@XmlElements。@XmlElements用于表示选择的XML模式概念:

  • http://bdoughan.blogspot.com/2010/10/jaxb-and-xsd-choice-xmlelements.html

这是您的示例的外观:

@XmlElements({ 
    @XmlElement(name="girl", type=Girl.class),
    @XmlElement(name="boy", type=Boy.class)
})
@XmlElementWrapper
public List<Person> getPeople() {
    return people;
}

@XmlElementRef对应于XML模式中的替换组的概念。这就是为什么上一个答案要求将Person从接口更改为类的原因。

  • http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-substitution.html


 类似资料:
  • 我有 和Xlink类,该类在内联变量中工作良好。 对于的XML输入 并且子课程拒绝被取消注册(没有任何异常被抛出)。 注:不幸的是,MOXy不是一个选项。 编辑:新编组对象 Edit2:在对测试对象进行了一些解组和编组的实验之后,我发现我需要在内容的标题中定义xmlns名称空间,以便与类似问题在于,我从一个包装类中获取Course元素,该包装类由resteasy解析出来。因此,生成的类不会携带名称

  • 我对类上的接口实现的理解是,接口类型引用实现接口的类的对象。 但是当我研究下面的代码片段在上面的代码中使用时… GetConnection(host,username,password)返回对对象的引用(类型为Connection),但DriverManager类中没有实现接口。谁能澄清我的这个疑问..?还是我漏掉了什么? 下面的代码段不能得到相同的东西 createStatement()应该返回

  • 我有jaxb生成的数据结构。部分结构基本相同,但它们位于不同的名称空间中,因此生成的Java类型不同。 我需要在这些结构之间传输数据。在项目中,ModelMapper用于映射,所以我希望使用它。 我的问题是ModelMapper无法映射为'maxOccurs="unb界"元素生成的列表。 假设我有以下模式: 我在namespacea和namespaceb中都有这个模式,因此Jaxb将以下类型生成到

  • 例如,以下结果结构将是理想的: -只读接口 -可变实现 或者更好的是,有没有一种不同的方式来实现这一点?

  • 在我们的应用程序中有一个相当常见的模式。我们在 Xml 中配置一组(或列表)对象,这些对象都实现了一个公共接口。在启动时,应用程序读取 Xml 并使用 JAXB 创建/配置对象列表。我从来没有想出(在多次阅读各种帖子之后)仅使用JAXB来做到这一点的“正确方法”。 例如,我们有一个接口,以及多个具体的实现类,它们具有一些共同的属性,以及一些不同的属性和非常不同的行为。我们用来配置应用程序使用的费用

  • 问题内容: 我有看起来像下面的XML: 我有一个如下的ObjectList类: 还有一个对象类,如下所示: 当我尝试使用以下代码将xml解组为和对象时: 我收到以下错误: javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“ ObjectList”)。期望的元素是<{} Object>,<{} objectList> 编辑: 我只是注意到几个问题,我