简体   繁体   中英

Marshalling Java Objects into XML using JAXB

I'm using JAXB to marshall Java Objects into XML. The ide i'm using is JDeveloper 11.1.1.7.0 in windows OS. Whenever i run that particular java code i get an error message which says

"Error(1,1): file:/C:/JDeveloper/mywork/bugdashboard/Model/src/model/BugReport.xml<Line 1, Column 1>: XML-20108: (Fatal Error) Start of root element expected."

Even though there seem to be no errors in the code still i'm not able to get the desired output..Please Help..

My JAVA code..

     package model;


     import java.io.File;

     import java.util.ArrayList;
     import java.util.List;
     import javax.xml.bind.JAXBContext;
     import javax.xml.bind.JAXBException;
     import javax.xml.bind.Marshaller;


     public class JavaObvjecttoXml {



     public void xmlGenerator() {

    //super();
    JavaServiceFacade fcd = new JavaServiceFacade();
    bugvalue track, track1, track2;
    List<ReportDto> bugReport, bugrePort1, bugrePort2;
    List<bugvalue> reportMetaData= new ArrayList<bugvalue>();    
    ReportMetaData rmd = new ReportMetaData();



    try {
        rmd.setBugreportmetadata(new ArrayList<bugvalue> ());
        JAXBContext context = JAXBContext.newInstance(ReportMetaData.class);

        Marshaller marshaller;
        marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        track = new bugvalue();
        bugReport = fcd.getBugSeverityReport();
        track.setBugReport(bugReport);
        track.setLabel("Bug by severity");
        track.setTile("severity");
        track.setChatType("PIE");
        track.setXAxisLabel("Label");
        track.setYAxisLAbel("Label Count");

        track1 = new bugvalue();
        bugrePort1 = fcd.getBugStatusReport();
        track1.setBugReport(bugrePort1);
        track1.setLabel("Bug by Status");
        track1.setTile("status");
        track1.setChatType("bar");
        track1.setXAxisLabel("count");
        track1.setYAxisLAbel("Label");

        track2 = new bugvalue();
        bugrePort2 = fcd.getBugCategoryReport();
        track2.setBugReport(bugrePort2);
        track2.setLabel("Bug by Category");
        track2.setTile("category");
        track2.setChatType("PIE");
        track2.setXAxisLabel("count");
        track2.setYAxisLAbel("Label"); 

        reportMetaData.add(track);
        reportMetaData.add(track1);
        reportMetaData.add(track2);
        rmd.setBugreportmetadata(reportMetaData);
        File output = new File("C:\\JDeveloper\\mywork\\bugdashboard\\Model\\src\\model\\BugReport.xml");
        marshaller.marshal(rmd, output);

        }
    catch(JAXBException e){
        e.printStackTrace();

    }







    }


     /**
     * @param args
     */

     public static void main(String[] args) {

    JavaObvjecttoXml obj = new JavaObvjecttoXml();
       obj.xmlGenerator(); 
   }


  }

File ReportMetaData.java

    package model;

    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.bind.annotation.XmlRootElement;

    @ XmlRootElement(name = "ReportMetaData")

    public class ReportMetaData {

    private List<bugvalue> bugreportmetadata = new ArrayList<bugvalue>();

    public List<bugvalue> getBugreportmetadata() {
      return bugreportmetadata;
    }

    */ @param bugreportmetadata
    */
    public void setBugreportmetadata(List<bugvalue> bugreportmetadata) {
       this.bugreportmetadata = bugreportmetadata;
    }

     public ReportMetaData() {
    super();
    }
    }

The error message..

错误

The file BugReport.xml

XML文件

As you can see from the above screen shot the file BugReport.xml is being generated but it's empty..

I suspect you need to annotate the fields you intend to output when you mashall the object to XML. Java™ sources generated by the JAX-B schema compiler I use apply the following annotation to the object attribute definitions:

@XmlElement(required = true)

In this case, the relevant section of your ReportMetaData class would look like this:

@XmlElement(required = true)
private List<bugvalue> bugreportmetadata = new ArrayList<bugvalue>();

The JAX-B schema compiler also generates two additional annotations before the @XmlRootElement annotation:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
   "bugreportmetadata"
})

In a JAX-B generated class structure, each class definition has these annotations. In addition, the @XmlType annotations for the nested class definitions contain the name of the type, so that the annotation for the bugvalue class might look like this:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bugvalue", propOrder = {
  // TODO: list the fields for BugValue as defined
})

The all lower case definition of bugvalue, depending on the coding for the JAX-B marshaller, may also create a problem. When marshalling an object, the JAX-B processor has to dynamically access and class definitions and generate element identifiers from them. If the JAX-B processor relies on Java naming conventions to do this, code that does not adhere to these conventions may potentially fail.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM