简体   繁体   English

创建 JAXBContext 实例时出现 IndexOutOfBoundsException

[英]IndexOutOfBoundsException when creating instance of JAXBContext

So this program is supposed to marshall the object I've created.所以这个程序应该编组我创建的 object。 I create an object and give value to every property it has, with the intention of generating a.xml with its data.我创建了一个 object 并为其拥有的每个属性赋予价值,目的是使用其数据生成 a.xml。 To do so i have to make an instance of JAXBContext in which I specify the class of the object.为此,我必须创建一个 JAXBContext 实例,在其中我指定 object 的 class。 And this is where i get the IndexOutOfBoundsException:这就是我得到 IndexOutOfBoundsException 的地方:

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

Right as i get to the above mentioned line, i get当我到达上面提到的那条线时,我得到了

Output from ActividadXML3 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)```

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这是我的程序的主要 class ,我在其中创建 object 并填充其所有属性以希望在此工作时生成.xml

ActividadXML3.java 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 来帮助我,我认为您不需要子类的 rest 但如果您这样做,请告诉我,我会很乐意编辑并发布它们。

HealthTopic.class健康主题.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编辑:添加类的 rest 因为它可能会有所帮助

Group.java组.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 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 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** ** 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.正如有人所说,我尝试修改 ArrayLists 的 getter,以防它们是 null,以便我返回新创建的 ArrayList,但我仍然遇到相同的错误。

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.在 HealthTopic class 中,更改列表的吸气剂。 if list is null then create object and then only return list like below (change for all list):如果列表是 null 然后创建 object 然后只返回如下列表(更改所有列表):

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问题出在您的站点 class 中,请对您的站点class 进行以下更改

  1. Add添加

    @XmlAccessorType(XmlAccessType.FIELD)
  2. Remove @XmlMixed annotation for informationCategory variable删除 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