Java JAXB元素列表中缺少字段

Java JAXB元素列表中缺少字段,java,jaxb,Java,Jaxb,我遇到了一个问题,对于一个可以相互包含并扩展基类的类层次结构,其中一个类在添加到“基”对象列表时不会显示详细信息。由于种种原因,我不得不使用JAXB,所以我试图找出遗漏或错误的地方。我已经把它简化为下面的示例代码 public class BaseSchema {} @XmlRootElement(name="ObjectA") @XmlAccessorType(XmlAccessType.FIELD) public class ObjectA extends BaseSchema { p

我遇到了一个问题,对于一个可以相互包含并扩展基类的类层次结构,其中一个类在添加到“基”对象列表时不会显示详细信息。由于种种原因,我不得不使用JAXB,所以我试图找出遗漏或错误的地方。我已经把它简化为下面的示例代码

public class BaseSchema {}

@XmlRootElement(name="ObjectA")
@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectA extends BaseSchema {
  private String thingA;
  @XmlElementWrapper(name="listOfBs")
  @XmlElement(name="b-item")
  private List<ObjectB> listB = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectB extends BaseSchema {
  private String thingB;
  @XmlElementWrapper(name="listOfCs")
  @XmlElement(name="c-item")
  private List<ObjectC> listC = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectC extends BaseSchema {
  private String thingC;
  @XmlElementWrapper(name="listOfBases")
  @XmlElement(name="base-item")
  private List<BaseSchema> listBase = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectD extends BaseSchema {
  private String thingD;
  // getter and setter
}
创建输出的代码:

public class MarshalTest {
  public void test() throws Exception {
    ObjectA base = new ObjectA();
    base.setThingA("Base element");

    ObjectB b1 = new ObjectB();
    b1.setThingB("B1");
    base.getListB().add(b1);

    ObjectC c1 = new ObjectC();
    c1.setThingC("C1");
    b1.getListC().add(c1);

    ObjectA a1 = new ObjectA();
    a1.setThingA("A1");
    c1.getListBase().add(a1);

    ObjectD d1 = new ObjectD();
    d1.setThingD("D1");
    c1.getListBase().add(d1);

    ObjectA a2 = new ObjectA();
    a2.setThingA("A2");
    c1.getListBase().add(a2);

    ObjectB b2 = new ObjectB();
    b2.setThingB("B2");
    c1.getListBase().add(b2);

    ObjectC c2 = new ObjectC();
    c2.setThingC("C2");
    c1.getListBase().add(c2);

    ObjectD d2 = new ObjectD();
    d2.setThingD("D2");
    c1.getListBase().add(d2);

    JAXBContext jaxbContext = JAXBContext.newInstance(base.getClass());
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    StringWriter writer = new StringWriter();

    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.marshal(base, writer);
    System.out.println(writer.toString());
  }


我认为问题在于JAXB不知道您的ObjectD类。您是否可以尝试将
@xmlseealway({ObjectA.class,ObjectB.class,ObjectC.class,ObjectD.class})
添加到
BaseSchema
类中? e、 g


你能准备一份吗?也就是说,包括创建对象结构的代码,并将其添加到有效的问题中!我不明白为什么它能“找到”A、B和C,尽管如此。也许在这些其他类中包含其他内部JAXB注释使它们“可见”?我尝试向
ObjectD.thingD
字段添加
xmlement
注释,但没有任何帮助,所以我不确定。太棒了!不知何故,其他类似乎对jaxb是静态可见的,而d则不是
public class MarshalTest {
  public void test() throws Exception {
    ObjectA base = new ObjectA();
    base.setThingA("Base element");

    ObjectB b1 = new ObjectB();
    b1.setThingB("B1");
    base.getListB().add(b1);

    ObjectC c1 = new ObjectC();
    c1.setThingC("C1");
    b1.getListC().add(c1);

    ObjectA a1 = new ObjectA();
    a1.setThingA("A1");
    c1.getListBase().add(a1);

    ObjectD d1 = new ObjectD();
    d1.setThingD("D1");
    c1.getListBase().add(d1);

    ObjectA a2 = new ObjectA();
    a2.setThingA("A2");
    c1.getListBase().add(a2);

    ObjectB b2 = new ObjectB();
    b2.setThingB("B2");
    c1.getListBase().add(b2);

    ObjectC c2 = new ObjectC();
    c2.setThingC("C2");
    c1.getListBase().add(c2);

    ObjectD d2 = new ObjectD();
    d2.setThingD("D2");
    c1.getListBase().add(d2);

    JAXBContext jaxbContext = JAXBContext.newInstance(base.getClass());
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    StringWriter writer = new StringWriter();

    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.marshal(base, writer);
    System.out.println(writer.toString());
  }

@XmlSeeAlso({ ObjectA.class, ObjectB.class, ObjectC.class, ObjectD.class }
public class BaseSchema {}