Java 3项IllegalAnnotationException罪名

Java 3项IllegalAnnotationException罪名,java,jaxb,unmarshalling,Java,Jaxb,Unmarshalling,我以前从未使用过JAXB。我正在做一个测试工具项目。我有大约20个不同的测试用例。当我运行我的测试时,我得到了这个错误 我的结构是: A是基本的测试用例类 B扩展A C扩展了B 基类A: public class A { public A(String t){ testName = t; } private String aData; private String testName; public void setAData(String a){ aDa

我以前从未使用过JAXB。我正在做一个测试工具项目。我有大约20个不同的测试用例。当我运行我的测试时,我得到了这个错误

我的结构是:

A
是基本的测试用例类

B
扩展
A

C
扩展了
B

基类A:

public class A {
  public A(String t){
     testName = t;
  }

  private String aData;
  private String testName;
  public void setAData(String a){
     aData = a;
  }

  public void getAData(){
     return aData;
  }

  public void setTestName(String t){
     testName = t;
  }

  public void getTestName(){
     return testName;
  }
}
B类:

public class B extends A{ 
   public B(String testName){
      super(testName);
   }

   private String bData;
   public void setBData(String b){
      bData = b.trim();
   }
   public String getData(){
      return bData;
   }       
}
C类:

@XmlRootElement(name="C")
public class C extends B{
    public C(String testName){
        super(testName);
    }

    private String cData;
    public void setCData(String c){
        cData = c;
    }
    public String getCData(){
        return cData;
    }
}
我写的xml文件的解包

public C unmarshall(C test, String dir){
    try {
        JAXBContext jc = JAXBContext.newInstance(c.getClass);
        Unmarshaller u = jc.createUnmarshaller();

        test = (C)u.unmarshal(new FileInputStream(dir));
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    return test;
 }
我的xml文件如下所示:

<C>
   <aData> aaaa </aData>
   <bData> bbbb </bData>
   <cData> cccc </cData>
</C>

aaaa
bbbb
中交

当我运行代码时,我得到了3个IllegalAnnotationException计数。

IllegalAnnotationException是由于A、B和C上没有默认的零参数构造函数

添加到:

public A() {
}
添加到B:

public B() {
}
并在C中添加:

public C() {
}

这是因为您正在创建JAXBcontext实例的类的子元素与其中定义的元素名称的名称不同

例如:

@XmlType(name = "xyz", propOrder =
{ "a", "b", "c", "d" })
@XmlRootElement(name = "testClass")
public class TestClass
{

  @XmlElement(required = true)
  protected Status status;
  @XmlElement(required = true)
  protected String mno;
  @XmlElement(required = true)

}
在上面的类中,您没有“xyz”,但是如果您将放置不可用的属性名,JAXBContext实例化将抛出IlligalAnnotationException


这样你就有3个地名不匹配了。所以有3个IllegaAnnotationException计数。

为什么要添加零args构造函数?据我所知,需要零arg默认构造函数,因为序列化/反序列化的工作方式是首先使用默认构造函数创建实例,然后使用反射注入值。所以您需要一个默认构造函数。