簡體   English   中英

創建 JAXBContext 實例時出現 IndexOutOfBoundsException

[英]IndexOutOfBoundsException when creating instance of JAXBContext

所以這個程序應該編組我創建的 object。 我創建了一個 object 並為其擁有的每個屬性賦予價值,目的是使用其數據生成 a.xml。 為此,我必須創建一個 JAXBContext 實例,在其中我指定 object 的 class。 這就是我得到 IndexOutOfBoundsException 的地方:

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

當我到達上面提到的那條線時,我得到了

Output 來自 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)```

在這一點上,我在搜索文檔和論壇后被困在這里兩天沒有任何進展,所以當我們找不到答案並且我們感到不知所措時,我確實像我們所有人一樣:打開一個堆棧溢出問題以被社區燒毀.

這是我的程序的主要 class ,我在其中創建 object 並填充其所有屬性以希望在此工作時生成.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());
        }
    }

}

我很確定您將需要我的 HealthTopic.class 來幫助我,我認為您不需要子類的 rest 但如果您這樣做,請告訴我,我會很樂意編輯並發布它們。

健康主題.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 + '}';
    }



}

如果有人能夠找到解決方案或為我指明正確的方向,這對我來說意義重大,因為我已經在這方面浪費了太多時間而沒有進展,如果沒有解決問題,我會感覺很糟糕。

編輯:添加類的 rest 因為它可能會有所幫助

組.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 + '}';
    }


}

這應該是全部。 正如有人所說,我嘗試修改 ArrayLists 的 getter,以防它們是 null,以便我返回新創建的 ArrayList,但我仍然遇到相同的錯誤。

我認為我的程序沒有更多代碼可以顯示,但如果我錯了請告訴我。

在 HealthTopic class 中,更改列表的吸氣劑。 如果列表是 null 然后創建 object 然后只返回如下列表(更改所有列表):

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

問題出在您的站點 class 中,請對您的站點class 進行以下更改

  1. 添加

    @XmlAccessorType(XmlAccessType.FIELD)
  2. 刪除 informationCategory 變量的 @XmlMixed 注釋

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM