xmlrootelement unmarshal parse online jaxbunmarshaller jaxbcontext example bean java xml jaxb

unmarshal - parse xml java jaxb



Jaxb, Class tiene dos propiedades con el mismo nombre (16)

Acabo de encontrarme con este problema y lo solucioné.

El origen del problema es que tiene tanto XmlAccessType.FIELD como pares de getters y setters. La solución es eliminar setters y agregar un constructor predeterminado y un constructor que tome todos los campos.

con jaxb, intento leer un archivo xml, solo unos pocos elementos en el archivo xml son interesantes, así que me gustaría omitir muchos elementos

contenido xml

xml intento leer

<?xml version="1.0" encoding="UTF-8"?> <!--Sample XML file generated by XMLSpy v2010 rel. 3 sp1 (http://www.altova.com)--> <flx:ModeleREP xsi:schemaLocation="urn:test:mod_rep.xsd mod_rep.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flx="urn:test:mod_rep.xsd"> <flx:DocumentHeader> <flx:Identification v="04489"/> </flx:DocumentHeader> <flx:TimeSeries> <flx:Identification v="test1a"/> <flx:BusinessType v="A01"/> <flx:Product v="123a"/> <flx:ResourceObject codingScheme="N" v="testa"/> <flx:Period> <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> <flx:Resolution v="PT2H"/> <flx:Pt> <flx:P v="1"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> </flx:Period> </flx:TimeSeries> <flx:TimeSeries> <flx:Identification v="test2a"/> <flx:BusinessType v="A01"/> <flx:Product v="a123b"/> <flx:ResourceObject codingScheme="N" v="test2"/> <flx:Period> <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> <flx:Resolution v="PT2H"/> <flx:Pt> <flx:P v="1"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> <flx:Pt> <flx:P v="2"/> <flx:Q unitCode="String" v="1.0"/> <flx:A currencyIdentifier="String" v="195.0"/> </flx:Pt> </flx:Period> </flx:TimeSeries> </flx:ModeleREP>

mi clase

@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") public class ModeleREP { @XmlElement(name="TimeSeries") protected List<TimeSeries> timeSeries; public List<TimeSeries> getTimeSeries() { if (this.timeSeries == null) { this.timeSeries = new ArrayList<TimeSeries>(); } return this.timeSeries; } public void setTimeSeries(List<TimeSeries> timeSeries) { this.timeSeries = timeSeries; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "TimeSeries") public class TimeSeries { @XmlElement(name="ResourceObject") protected RessourceObject resourceObject; @XmlElement(name = "Period") protected Period period; public RessourceObject getResourceObject() { return this.resourceObject; } public void setResourceObject(RessourceObject resourceObject) { this.resourceObject = resourceObject; } public Period getPeriod() { return this.period; } public void setPeriod(Period period) { this.period = period; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "ResourceObject") public class RessourceObject { @XmlAttribute(name = "codingScheme") protected String codingScheme; @XmlAttribute(name = "v") protected String v; public String getCodingScheme() { return this.codingScheme; } public void setCodingScheme(String codingScheme) { this.codingScheme = codingScheme; } public String getV() { return this.v; } public void setV(String v) { this.v = v; } } @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name = "Period") public class Period { @XmlElement(name = "TimeInterval") protected TimeInterval timeInterval; @XmlElement(name = "Pt") protected List<Pt> pt; public TimeInterval getTimeInterval() { return this.timeInterval; } public void setTimeInterval(TimeInterval timeInterval) { this.timeInterval = timeInterval; } public List<Pt> getPt() { if (this.pt == null) { this.pt = new ArrayList<Pt>(); } return this.pt; } public void setPt(List<Pt> pt) { this.pt=pt; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "TimeInterval") public class TimeInterval { @XmlAttribute(name = "v") private String timeIntervalPeriod; public String getTimeIntervalPeriod() { return this.timeIntervalPeriod; } public void setTimeIntervalPeriod(String timeIntervalPeriod) { this.timeIntervalPeriod = timeIntervalPeriod; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Pt") public class Pt { @XmlElement(name = "P") protected P p; @XmlElement(name = "A") protected A a; public P getP() { return this.p; } public void setP(P p) { this.p = p; } public A getA() { return this.a; } public void setA(A a) { this.a = a; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "P") public class P { @XmlAttribute(name = "v") protected String position; public String getPosition(){ return this.position; } public void setPosition(String position){ this.position=position; } } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "A") public class A { @XmlAttribute(name = "v") protected String calculatedAmount; public String getCalculatedAmount() { return this.calculatedAmount; } public void setCalculatedAmount(String calculatedAmount) { this.calculatedAmount = calculatedAmount; } }

cuando intento leer el archivo xlm obtengo consigo

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Class has two properties of the same name "timeSeries" this problem is related to the following location: at public java.util.List testjaxp.ModeleREP.getTimeSeries() at testjaxp.ModeleREP this problem is related to the following location: at protected java.util.List testjaxp.ModeleREP.timeSeries at testjaxp.ModeleREP

no entiendo este error

editar: uso jaxb-impl-2.1.12

ok ahora no tengo ningún error, pero cuando verifico mi objeto, timeSeries es nulo ...

¿Entonces quizás jaxb parece tener problemas con flx?


El mismo problema que enfrenté, agregué

@XmlRootElement(name="yourRootElementName") @XmlAccessorType(XmlAccessType.FIELD)

y ahora está funcionando.


Estas son las dos propiedades que JAXB está mirando.

public java.util.List testjaxp.ModeleREP.getTimeSeries()

y

protected java.util.List testjaxp.ModeleREP.timeSeries

Esto se puede evitar utilizando la anotación JAXB en el método get tal como se menciona a continuación.

@XmlElement(name="TimeSeries")) public java.util.List testjaxp.ModeleREP.getTimeSeries()


Funcionará cuando coloque su anotación antes de los captadores y la elimine de los atributos protegidos:

protected String codingScheme; @XmlAttribute(name = "codingScheme") public String getCodingScheme() { return this.codingScheme; }


Necesita configurar la clase ModeleREP también con @XmlAccessorType(XmlAccessType.FIELD) como lo hizo con la clase TimeSeries .

Mira todo OOXS


No especificó qué versión de JAXB-IMPL está utilizando, pero una vez tuve el mismo problema (con jaxb-impl 2.0.5) y lo resolví utilizando la anotación en el nivel getter en lugar de usarlo en el nivel de miembro.


Si utilizamos las anotaciones a continuación y eliminamos la anotación "@XmlElement", el código debería funcionar correctamente y el XML resultante tendría los nombres de los elementos similares al miembro de la clase.

@XmlRootElement(name="<RootElementName>") @XmlAccessorType(XmlAccessType.FIELD)

En caso de que realmente se requiera el uso de "@XmlElement", defínalo como nivel de campo y el código debería funcionar perfectamente. No defina la anotación en la parte superior del método getter.

Había intentado ambos enfoques mencionados anteriormente y pude solucionar el problema.


Su JAXB está mirando tanto el método getTimeSeries() como el miembro timeSeries . No dice qué implementación de JAXB está utilizando ni su configuración, pero la excepción es bastante clara.

en public java.util.List testjaxp.ModeleREP.getTimeSeries ()

y

en java.util.List protegido testjaxp.ModeleREP.timeSeries

Necesita configurar las cosas de JAXB para usar anotaciones (según su @XmlElement(name="TimeSeries") ) e ignorar los métodos públicos.


También enfrenté un problema como este y configuré esto.

@XmlRootElement(name="yourRootElementName") @XmlAccessorType(XmlAccessType.FIELD)

Esto funcionará al 100%


También he visto algunos problemas similares a este.

Creo que es por el lugar donde usamos la anotación " @XMLElement " en la clase (bean).

Y creo que el JAXB (procesador de anotaciones) considera el método de campo miembro y getter del mismo elemento de campo como propiedades diferentes, cuando usamos la anotación @XMLElement en el nivel de campo y arrojamos la excepción IllegalAnnotationExceptions .

Mensaje de excepción:

La clase tiene dos propiedades con el mismo nombre "timeSeries"

En el Método Getter:

at public java.util.List testjaxp.ModeleREP.getTimeSeries()

En el campo de miembros:

at protected java.util.List testjaxp.ModeleREP.timeSeries

Solución: en lugar de usar @XmlElement en el campo , úselo en el método getter .


Tuve una clase de servicio con firma como se muestra a continuación "

@WebMethod public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {

En la ejecución obtuve el mismo error para los campos FetchIQAStatusResponseVO . Acabo de agregar una línea encima de FetchIQAStatusResponseVO :

@XmlAccessorType(XmlAccessType.FIELD) //This line added public class FetchIQAStatusResponseVO {

y esto resolvió el problema.


Una manera rápida y sencilla de solucionar este problema es eliminar @XmlElement(name="TimeSeries") de la parte superior de la declaración de declaración de variables protected List<TimeSeries> timeSeries; en la parte superior de su getter, public List<TimeSeries> getTimeSeries() .

Por lo tanto, su clase ModeleREP se verá así:

@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") public class ModeleREP { protected List<TimeSeries> timeSeries; @XmlElement(name="TimeSeries") public List<TimeSeries> getTimeSeries() { if (this.timeSeries == null) { this.timeSeries = new ArrayList<TimeSeries>(); } return this.timeSeries; } public void setTimeSeries(List<TimeSeries> timeSeries) { this.timeSeries = timeSeries; } }

¡Espero eso ayude!


acaba de agregar esto a mi clase

@XmlAccessorType(XmlAccessType.FIELD)

trabajado como un cham


solo declare las variables miembro en privado en la clase que desea convertir a XML. Feliz codificación



"La clase tiene dos propiedades con la misma excepción de nombre" puede suceder cuando tiene un miembro de clase x con un nivel de acceso público y un getter / setter para el mismo miembro.

Como regla general de Java, no se recomienda utilizar un nivel de acceso público junto con getters y setters.

Verifique esto para obtener más detalles: Propiedad pública VS Propiedad privada con getter?

Para arreglar eso:

  1. Cambie el nivel de acceso de sus miembros a privado y mantenga su getter / setter
  2. Retire el captador y el colocador del miembro