2013-05-14 66 views
2

我想从使用JAXB的对象构建XML。使用jaxb将对象转换为XML的异常

但我失去了一些东西,因为我得到一个异常:

javax.xml.bind.MarshalException - 带链接的异常:[com.sun.istack.internal.SAXException2:类员工,也没有任何的它的超类在这方面是已知的。 javax.xml.bind.JAXBException:Employee类或其任何超 类是已知的这种情况下]

@XmlRootElement(name = "employee") 
public class Employee { 
    private String name; 
    private String employeeId; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
    public String getEmployeeId() { 
     return employeeId; 
    } 

    public void setEmployeeId(String employeeId) { 
     this.employeeId = employeeId; 
    } 

} 

@XmlRootElement(name = "Data") 
public class Data { 
    public Data() { 
    } 

    private List employees; 

    @XmlElementWrapper(name = "employeeList") 
    @XmlElement(name = "employee") 
    public List getEmployees() { 
     return employees; 
    } 

    public void setEmployees(List employees) { 
     this.employees = employees; 
    } 

} 


public static void main(String[] args) { 
     ArrayList list = new ArrayList(); 

     Employee e1 = new Employee(); 
     e1.setName("Name"); 
     e1.setEmployeeId("1"); 
     list.add(e1); 
     Data data = new Data(); 
     data.setEmployees(list); 

     JAXBContext context; 

     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 

     try { 
      context = JAXBContext.newInstance(Data.class); 
      Marshaller m = context.createMarshaller(); 
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
      m.marshal(data, outStream); 
     } catch (JAXBException e) { 

      e.printStackTrace(); 
     } 

    } 

回答

4

你需要做以下操作之一,使您的JAXB(JSR-222。 )的实现意识到Data类中的employees属性包含Employee的实例。

@XmlElementWrapper(name = "employeeList") 
@XmlElement(name = "employee", type=Employee.class) 
public List getEmployees() { 
    return employees; 
} 

@XmlElementWrapper(name = "employeeList") 
@XmlElement(name = "employee") 
public List<Employee> getEmployees() { 
    return employees; 
}