java - 创建 JAXBContext 实例时出现 IndexOutOfBoundsException
问题描述
所以这个程序应该编组我创建的对象。我创建一个对象并为其拥有的每个属性赋予价值,目的是使用其数据生成一个 .xml。为此,我必须创建一个 JAXBContext 实例,在其中指定对象的类。这就是我得到 IndexOutOfBoundsException 的地方:
"JAXBContext jc = JAXBContext.newInstance(HealthTopic.class);"
当我到达上面提到的那条线时,我得到了
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)```
在这一点上,我在搜索文档和论坛后被困在这里 2 天没有任何进展,所以当我们找不到答案并且我们感到不知所措时,我确实像我们所有人一样:打开一个堆栈溢出问题以被社区烧毁.
这是我的程序的主类,我在其中创建对象并填充其所有属性,希望当它起作用时,生成.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 来帮助我,我认为你不需要其余的子类,但如果你需要,请告诉我,我会很乐意编辑并发布它们。
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 + '}';
}
}
如果有人能够找到解决方案或为我指明正确的方向,这对我来说意义重大,因为我已经在这方面浪费了太多时间而没有进展,如果不解决这个问题,我会感觉很糟糕。
编辑:添加其余的类,因为它可能会有所帮助
组.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,以防它们为空,以便我返回一个新创建的 ArrayList,但我仍然遇到相同的错误。
我认为我的程序没有更多代码可以显示,但如果我错了请告诉我。
解决方案
问题出在您的站点类中,请对您的站点类进行以下更改
添加
@XmlAccessorType(XmlAccessType.FIELD)
删除 informationCategory 变量的 @XmlMixed 注释
// @XmlMixed @XmlElement(name="information-category") private ArrayList<String> informationCategory;
推荐阅读
- python - 为什么我在beautifulsoup 中的find 方法在抓取coursera 网站时返回None?
- database - 使用数据库在 Web 服务的后端和前端之间存储临时结果
- sql - 我可以从 Ant 以 root 用户登录 MariaDB 吗?
- angular - 来自 REST API WordPress 服务的对象的角度循环
- imap - 如何删除 IMAP PERMANENTFLAG?
- docker - 当 Curl 时,Docker 本地 Nexus 响应“来自服务器的空回复”
- android - 简单的客户端服务器应用程序android
- node.js - Ubuntu 服务器上的 npm 安装 sqlite3 错误
- flutter - 构建仪表板时引发了以下 _CastError(脏,依赖项:[MediaQuery],状态:DashboardState#783ce):
- java - 如何避免覆盖实体中的数据