简体   繁体   中英

IndexOutOfBoundsException when creating instance of JAXBContext

So this program is supposed to marshall the object I've created. I create an object and give value to every property it has, with the intention of generating a.xml with its data. To do so i have to make an instance of JAXBContext in which I specify the class of the object. And this is where i get the IndexOutOfBoundsException:

"JAXBContext jc = JAXBContext.newInstance(HealthTopic.class);"

Right as i get to the above mentioned line, i get

Output from ActividadXML3

```Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.addProperty(ClassInfoImpl.java:885)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.findFieldProperties(ClassInfoImpl.java:393)
    at com.sun.xml.internal.bind.v2.model.impl.ClassInfoImpl.getProperties(ClassInfoImpl.java:296)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeClassInfoImpl.getProperties(RuntimeClassInfoImpl.java:171)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:246)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:88)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:83)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
    at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.addAllSubtypes(ReferencePropertyInfoImpl.java:332)
    at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.calcTypes(ReferencePropertyInfoImpl.java:158)
    at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.getElements(ReferencePropertyInfoImpl.java:107)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.getElements(RuntimeReferencePropertyInfoImpl.java:56)
    at com.sun.xml.internal.bind.v2.model.impl.ReferencePropertyInfoImpl.ref(ReferencePropertyInfoImpl.java:98)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.ref(RuntimeReferencePropertyInfoImpl.java:60)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeReferencePropertyInfoImpl.ref(RuntimeReferencePropertyInfoImpl.java:40)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:260)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:88)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getClassInfo(ModelBuilder.java:212)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:83)
    at com.sun.xml.internal.bind.v2.model.impl.RuntimeModelBuilder.getClassInfo(RuntimeModelBuilder.java:69)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:360)
    at com.sun.xml.internal.bind.v2.model.impl.ModelBuilder.getTypeInfo(ModelBuilder.java:375)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:439)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at actividadxml3.ActividadXML3.main(ActividadXML3.java:139)
C:\Users\aitor\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)```

At this point i have been 2 days stuck here with no progress after searching documentation and forums, so i do like all of us always do when we cant find the answer and we feel overwhelmed: Open a stack overflow question to be burnt by the community.

Here is the main class of my program in which i create the object and fill all of its properties to hopefully when this works, generate the.xml

ActividadXML3.java

package actividadxml3;

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

/**
 *
 * @author Smock
 */
public class ActividadXML3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {



        try{

            //crear y poblar objeto
            HealthTopic ht = new HealthTopic();
            //atributos HealthTopic
            ht.setMetaDesc("Un ataque cerebral hemorrágico ocurre cuando un vaso sanguíneo se rompe y sangra en el cerebro. Entérese sobre síntomas, diagnóstico y tratamientos ");
            ht.setTitle("Accidente cerebrovascular hemorrágico");
            ht.setUrl("https://medlineplus.gov/spanish/hemorrhagicstroke.html");
            ht.setId(6264);
            ht.setLanguage("Spanish");
            ht.setDateCreated("08/26/2015");
            //elementos valorados dentro de HealthTopic
            ArrayList<String> alsoCalled = new ArrayList<String>();
            alsoCalled.add("Accidente cerebral hemorrágico");
            alsoCalled.add("Ataque cerebral hemorrágico");
            alsoCalled.add("Derrame cerebral hemorrágico");
            ht.setAlsoCalled(alsoCalled);        
            ht.setFullSummary("https://medlineplus.gov/spanish/stroke.html");

            //GROUP
            Group gp = new Group();
            gp.setUrlGroup("https://medlineplus.gov/spanish/bloodheartandcirculation.html");
            gp.setIdGroup(7);
            gp.setValor("Sangre, corazón y circulación");
            ht.addObject(gp);
            Group gp2 = new Group();
            gp2.setUrlGroup("https://medlineplus.gov/spanish/brainandnerves.html");
            gp2.setIdGroup(14);
            gp2.setValor("Cerebro y nervios");
            ht.addObject(gp2);

            //LANGUAGE-MAPPED-TOPIC
            LanguageMappedTopic lmt = new LanguageMappedTopic();
            lmt.setUrlLanguage("https://medlineplus.gov/hemorrhagicstroke.html");
            lmt.setIdLanguage(6263);
            lmt.setLanguage("English");
            lmt.setValorLanguage("Hemorrhagic Stroke");
            ht.addObject(lmt);

            //PRIMARY-INSTITUTE
            PrimaryInstitute pi = new PrimaryInstitute();
            pi.setUrlInstitute("https://medlineplus.gov/spanish/nihinstitutes.html#NINDS");
            pi.setValor("Instituto Nacional de Trastornos Neurológicos y Accidentes Cerebrovasculares");
            ht.addObject(pi);

            //SITES
            Site s1 = new Site();
            s1.setTitle("Alta tras accidente cerebrovascular");
            s1.setUrl("https://medlineplus.gov/spanish/ency/patientinstructions/000132.htm");
            s1.setLanguageMappedUrl("https://medlineplus.gov/ency/patientinstructions/000132.htm");
            ArrayList<String>info1 = new ArrayList<String>();
            info1.add("Mas informacion");
            info1.add("Spanish/Español");
            info1.add("NON_DISPLAY (Patient Handout");
            s1.setInformationCategory(info1);
            s1.setOrganization("Enciclopedia Médica");
            ht.addObject(s1);

            Site s2 = new Site();
            s2.setTitle("Angiopatia amiloide cerebral");
            s2.setUrl("https://medlineplus.gov/spanish/ency/article/000719.htm");
            s2.setLanguageMappedUrl("https://medlineplus.gov/ency/article/000719.htm");
            ArrayList<String>info2 = new ArrayList<String>();
            info2.add("Mas informacion");
            info2.add("Spanish/Español");
            s2.setInformationCategory(info2);
            s2.setOrganization("Enciclopedia Médica");
            ht.addObject(s2);

            Site s3 = new Site();
            s3.setTitle("Hablemos sobre el ataque hemorrágico al cerebro");
            s3.setUrl("https://www.stroke.org/-/media/stroke-files/spanish-resources/ltas-hemorrhagic-stroke.pdf");
            s3.setLanguageMappedUrl("https://www.stroke.org/en/about-stroke/types-of-stroke/hemorrhagic-strokes-bleeds");
            ArrayList<String>info3 = new ArrayList<String>();
            info3.add("Mas informacion");
            info3.add("Spanish/Español");
            s3.setInformationCategory(info3);
            s3.setOrganization("Asociación Americana del Corazón");
            s3.setStandardDescription("PDF");
            ht.addObject(s3);

            Site s4 = new Site();
            s4.setTitle("Hemorragia subaracnoidea");
            s4.setUrl("https://medlineplus.gov/spanish/ency/article/000701.htm");
            s4.setLanguageMappedUrl("https://medlineplus.gov/ency/article/000701.htm");
            ArrayList<String>info4 = new ArrayList<String>();
            info4.add("Mas informacion");
            info4.add("Spanish/Español");
            s4.setInformationCategory(info4);
            s4.setOrganization("Enciclopedia Médica");
            ht.addObject(s4);

            Site s5 = new Site();
            s5.setTitle("Prevención de un accidente cerebrovascular");
            s5.setUrl("https://medlineplus.gov/spanish/ency/patientinstructions/000678.htm");
            s5.setLanguageMappedUrl("https://medlineplus.gov/ency/patientinstructions/000678.htm");
            ArrayList<String>info5 = new ArrayList<String>();
            info5.add("Mas informacion");
            info5.add("Spanish/Español");
            info5.add("NON-DISPLAY (Patient Handout)");
            s5.setInformationCategory(info5);
            s5.setOrganization("Enciclopedia Médica");
            ht.addObject(s5);


            //System.out.println(ht.toString());

            //Error en jaxbConext indexOutofBoundsException en l asiguiente linea  
            System.out.println("Inicio creacion objeto JAXB");
            JAXBContext jc = JAXBContext.newInstance(HealthTopic.class);
            System.out.println("Ojala algun dia lea esto en pantalla");

            Marshaller mar = jc.createMarshaller();
            mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            File xml = new File("health-topic.xml");
            mar.marshal(ht, xml);


        }catch(JAXBException ex){
            System.out.println(ex);
            System.out.println(ex.getMessage());
        }
    }

}

Im pretty sure you will need my HealthTopic.class to help me, i dont think you need the rest of the subclasses but if you do, let me know and i will gladly edit and post them.

HealthTopic.class

package actividadxml3;

import java.util.ArrayList;
import javax.xml.bind.annotation.*;

/**
 *
 * @author Smock
 */
@XmlRootElement(name="health-topic")
@XmlAccessorType(XmlAccessType.FIELD)//todos los campos son automaticamente generados
public class HealthTopic {

    @XmlAttribute(name = "meta-desc")
    private String metaDesc;

    @XmlAttribute(name = "title")
    private String title;

    @XmlAttribute(name = "url")
    private String url;

    @XmlAttribute(name = "id")
    private int id;

    @XmlAttribute(name = "language")
    private String language;

    @XmlAttribute(name = "date-created")
    private String dateCreated;


    @XmlElement(name = "also-called")
    private ArrayList<String> alsoCalled;

    //@XmlMixed
    @XmlElement(name="full-summary")
    private String fullSummary;

    @XmlMixed
    @XmlElementRefs({
        @XmlElementRef(type = Group.class),
        @XmlElementRef(type = LanguageMappedTopic.class),
        @XmlElementRef(type = PrimaryInstitute.class),
        @XmlElementRef(type = Site.class)
    })

    private ArrayList<Object> objects = new ArrayList();

    public HealthTopic() {
    }

    public HealthTopic(String metaDesc, String title, String url, int id, String language, String dateCreated, ArrayList<String> alsoCalled, String fullSummary, ArrayList<Object> objects) {
        this.metaDesc = metaDesc;
        this.title = title;
        this.url = url;
        this.id = id;
        this.language = language;
        this.dateCreated = dateCreated;
        this.alsoCalled = alsoCalled;
        this.fullSummary = fullSummary;
        this.objects = objects;
    }

    public String getMetaDesc() {
        return metaDesc;
    }


    public void setMetaDesc(String metaDesc) {
        this.metaDesc = metaDesc;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public String getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(String dateCreated) {
        this.dateCreated = dateCreated;
    }

    public ArrayList<String> getAlsoCalled() {
        return alsoCalled;
    }

    public void setAlsoCalled(ArrayList<String> alsoCalled) {
        this.alsoCalled = alsoCalled;
    }

    public String getFullSummary() {
        return fullSummary;
    }

    public void setFullSummary(String fullSummary) {
        this.fullSummary = fullSummary;
    }

    public ArrayList<Object> getObjects() {
        return objects;
    }

    public void setObjects(ArrayList<Object> objects) {
        this.objects = objects;
    }



    public void addObject(Object object){
        objects.add(object);
    }

    @Override
    public String toString() {
        return "HealthTopic{" + "metaDesc=" + metaDesc + ", title=" + title + ", url=" + url + ", id=" + id + ", language=" + language + ", dateCreated=" + dateCreated + ", alsoCalled=" + alsoCalled + ", fullSummary=" + fullSummary + ", objects=" + objects + '}';
    }



}

It would mean a lot to me if somebody was able to find a solution to this or point me in the right direction, since I've already lost too much time in this with no progress and i would feel bad leaving this without a fix.

EDIT: Adding the rest of the classes since it may help

Group.java

package actividadxml3;

import javax.xml.bind.annotation.*;

/**
 *
 * @author Smock
 */
@XmlRootElement(name="group")
@XmlAccessorType(XmlAccessType.PROPERTY)//todos los getters/setter se generan automaticamente
public class Group {

    private String urlGroup;

    private int idGroup;

    //implementar valor del group
    private String valor;

    public Group() {
    }

    public Group(String urlGroup, int idGroup, String valor) {
        this.urlGroup = urlGroup;
        this.idGroup = idGroup;
        this.valor = valor;
    }

    public String getUrlGroup() {
        return urlGroup;
    }
    @XmlAttribute(name="url")
    public void setUrlGroup(String urlGroup) {
        this.urlGroup = urlGroup;
    }

    public int getIdGroup() {
        return idGroup;
    }

    @XmlAttribute(name="id")
    public void setIdGroup(int idGroup) {
        this.idGroup = idGroup;
    }

    public String getValor() {
        return valor;
    }

    //no hace falta anotaciones prueba
    public void setValor(String valor) {
        this.valor = valor;
    }


    @Override
    public String toString() {
        return "Group{" + "urlGroup=" + urlGroup + ", idGroup=" + idGroup + ", valor=" + valor + '}';
    }


}

LanguageMappedTopic.java

package actividadxml3;

import javax.xml.bind.annotation.*;

/**
 *
 * @author Smock
 */
@XmlRootElement(name="language-mapped-topic")
@XmlAccessorType(XmlAccessType.NONE) // nada se genera a no ser que se anote
public class LanguageMappedTopic {

    @XmlAttribute(name="url")
    private String urlLanguage;

    @XmlAttribute(name="id")
    private int idLanguage;

    @XmlAttribute(name="language")
    private String language;

    @XmlValue
    private String valorLanguage;


    public LanguageMappedTopic() {
    }

    public LanguageMappedTopic(String urlLanguage, int idLanguage, String language, String valorLanguage) {
        this.urlLanguage = urlLanguage;
        this.idLanguage = idLanguage;
        this.language = language;
        this.valorLanguage = valorLanguage;
    }

    public String getUrlLanguage() {
        return urlLanguage;
    }

    public void setUrlLanguage(String urlLanguage) {
        this.urlLanguage = urlLanguage;
    }

    public int getIdLanguage() {
        return idLanguage;
    }

    public void setIdLanguage(int idLanguage) {
        this.idLanguage = idLanguage;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public String getValorLanguage() {
        return valorLanguage;
    }

    public void setValorLanguage(String valorLanguage) {
        this.valorLanguage = valorLanguage;
    }

    @Override
    public String toString() {
        return "LanguageMappedTopic{" + "urlLanguage=" + urlLanguage + ", idLanguage=" + idLanguage + ", language=" + language + ", valorLanguage=" + valorLanguage + '}';
    }



}

PrimaryInstitute.java

package actividadxml3;

import javax.xml.bind.annotation.*;

/**
 *
 * @author Smock
 */
@XmlRootElement(name="primary-institute")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)//se genera todo lo declarado publico
public class PrimaryInstitute {


    private String urlInstitute;

    private String valor;

    public PrimaryInstitute() {
    }

    public PrimaryInstitute(String urlInstitute, String valor) {
        this.urlInstitute = urlInstitute;
        this.valor = valor;
    }

    public String getUrlInstitute() {
        return urlInstitute;
    }

    @XmlAttribute(name="url")
    public void setUrlInstitute(String urlInstitute) {
        this.urlInstitute = urlInstitute;
    }

    public String getValor() {
        return valor;
    }

    @XmlValue
    public void setValor(String valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return "PrimaryInstitute{" + "urlInstitute=" + urlInstitute + ", valor=" + valor + '}';
    }


}

** Site.class**

package actividadxml3;

import java.util.ArrayList;
import javax.xml.bind.annotation.*;
/**
 *
 * @author Smock
 */
@XmlRootElement(name="site")
public class Site {

    @XmlAttribute(name="title")
    private String title;

    @XmlAttribute(name="url")
    private String url;

    @XmlAttribute(name="language-mapped-url")
    private String languageMappedUrl;

    @XmlMixed
    @XmlElement(name="information-category")
    private ArrayList<String> informationCategory;

    @XmlElement(name="organization")
    private String organization;

    @XmlElement(name="standard-description",required=false)
    private String standardDescription;

    public Site() {
    }

    public Site(String title, String url, String languageMappedUrl, ArrayList<String> informationCategory, String organization, String standardDescription) {
        this.title = title;
        this.url = url;
        this.languageMappedUrl = languageMappedUrl;
        this.informationCategory = informationCategory;
        this.organization = organization;
        this.standardDescription = standardDescription;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getLanguageMappedUrl() {
        return languageMappedUrl;
    }

    public void setLanguageMappedUrl(String languageMappedUrl) {
        this.languageMappedUrl = languageMappedUrl;
    }

    public ArrayList<String> getInformationCategory() {
        if(informationCategory == null){
            informationCategory = new ArrayList<>();
        }
        return informationCategory;
    }

    public void setInformationCategory(ArrayList<String> informationCategory) {
        this.informationCategory = informationCategory;
    }

    public String getOrganization() {
        return organization;
    }

    public void setOrganization(String organization) {
        this.organization = organization;
    }

    public String getStandardDescription() {
        return standardDescription;
    }

    public void setStandardDescription(String standardDescription) {
        this.standardDescription = standardDescription;
    }

    @Override
    public String toString() {
        return "Site{" + "title=" + title + ", url=" + url + ", languageMappedUrl=" + languageMappedUrl + ", informationCategory=" + informationCategory + ", organization=" + organization + ", standardDescription=" + standardDescription + '}';
    }


}

This should be all. As somebody told, i tried modifying the getters for ArrayLists in case they were null so that i return a newly created ArrayList, but im still getting the same error.

I dont think there is more code of my program to show but let me know if im wrong.

in HealthTopic class, change your getter for list. if list is null then create object and then only return list like below (change for all list):

public ArrayList<String> getAlsoCalled() {
        if (alsoCalled == null) {
          alsoCalled = new ArrayList<>();
        } 
        return alsoCalled;
    }

Problem is in your Site class, please do the below changes to your Site class

  1. Add

    @XmlAccessorType(XmlAccessType.FIELD)
  2. Remove @XmlMixed annotation for informationCategory variable

    // @XmlMixed @XmlElement(name="information-category") private ArrayList<String> informationCategory;

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