con jaxb, trato de leer un archivo xml, solo algunos elementos en el archivo xml son interesantes, así que me gustaría omitir muchos elementos
xml trato de 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, obtengo
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, ¿tal vez jaxb parece tener problemas con flx?
@XmlAccessorType(XmlAccessType.FIELD)
anotaciónNo especificó qué versión de JAXB-IMPL está usando, pero una vez tuve el mismo problema (con jaxb-impl 2.0.5) y lo resolví usando la anotación en el nivel de captador en lugar de usarla en el nivel de miembro.
fuente
También he visto algunos problemas similares como este.
Creo que se debe al lugar donde usamos la anotación " @XMLElement " en la clase (bean).
Y creo que el JAXB (procesador de anotaciones) considera el campo miembro y el método getter del mismo elemento de campo como propiedades diferentes, cuando usamos la anotación @XMLElement en el nivel de campo y lanza la excepción IllegalAnnotationExceptions .
Mensaje de excepción:
En el método Getter:
En el campo de miembros:
Solución: en lugar de usar @XmlElement en el campo , utilícelo en el método getter .
fuente
acabo de agregar esto a mi clase
trabajó como un cham
fuente
Hay varias soluciones, pero básicamente si anota en la declaración de variable, entonces lo necesita
@XmlAccessorType(XmlAccessType.FIELD)
, pero si prefiere anotar un método get o set, entonces no lo hace.Entonces puedes hacer:
O:
fuente
Su JAXB está mirando tanto el
getTimeSeries()
método como el miembrotimeSeries
. No dice qué implementación de JAXB está usando, o su configuración, pero la excepción es bastante clara.y
Debe configurar sus cosas JAXB para usar anotaciones (según su
@XmlElement(name="TimeSeries")
) e ignorar los métodos públicos.fuente
Debe configurar la clase
ModeleREP
tanto@XmlAccessorType(XmlAccessType.FIELD)
como lo hizo con la claseTimeSeries
.Eche un vistazo a OOXS
fuente
Si usamos las siguientes anotaciones 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.
En caso de que el uso de "@XmlElement" sea realmente necesario, 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.
Intenté los dos enfoques mencionados anteriormente y resolví el problema.
fuente
"La clase tiene dos propiedades con el mismo nombre de excepción" puede ocurrir cuando tienes 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 más detalles: Propiedad pública VS Propiedad privada con captador?
Para arreglar eso:
fuente
Estas son las dos propiedades que JAXB está considerando.
y
Esto se puede evitar usando la anotación JAXB en el método get como se menciona a continuación.
fuente
simplemente declare las variables miembro como privadas en la clase que desea convertir a XML. Codificación feliz
fuente
El mismo problema que enfrenté, agregué
y ahora está funcionando.
fuente
Funcionará cuando coloque su anotación antes de los captadores y la elimine de los atributos protegidos:
fuente
Me encontré con este problema y lo resolví.
La fuente del problema es que tiene tanto XmlAccessType.FIELD como pares de captadores y definidores. La solución es eliminar los establecedores y agregar un constructor predeterminado y un constructor que tome todos los campos.
fuente
Tenía una clase de servicio con la firma de la siguiente manera "
Al ejecutar, obtuve el mismo error para los
FetchIQAStatusResponseVO
campos. Acabo de agregar una línea encima deFetchIQAStatusResponseVO
:y esto resolvió el problema.
fuente
ModeleREP#getTimeSeries()
tiene que estar con@Transient
anotación. Eso podría ayudar.fuente
Anotar con
@XmlTransient
resuelve ese problemaMire http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html para obtener más detalles
fuente
Una forma rápida y sencilla de solucionar este problema es eliminar el
@XmlElement(name="TimeSeries")
de la parte superior de la declaración de declaración de variablesprotected List<TimeSeries> timeSeries;
a la parte superior de su comprador,public List<TimeSeries> getTimeSeries()
.Por lo tanto, su
ModeleREP
clase se verá así:¡Espero eso ayude!
fuente
Hice prueba y error y llegué a la conclusión de que solo tienes que usar ambos
@XMLElement
o@XmlAccessorType(XmlAccessType.FIELD)
.¿Cuándo usar cuál?
caso 1 : si los nombres de campo y el nombre del elemento que desea usar en el archivo xml son diferentes, entonces debe usar
@XMLElement(name="elementName")
. Como esto vinculará campos con ese nombre de elemento y se mostrará en un archivo XML.caso 2 : si los nombres de los campos y el nombre del elemento respectivo en xml son iguales, simplemente puede usar
@XmlAccessorType(XmlAccessType.FIELD)
fuente
Se han dado muchas soluciones, y @Sriram y @ptomli también tocan brevemente los aspectos internos. Solo quiero agregar algunas referencias al código fuente para ayudar a comprender lo que está sucediendo bajo el capó.
De forma predeterminada (es decir, no se utilizan anotaciones adicionales excepto
@XmlRootElement
en la clase raíz), JABX intenta ordenar las cosas expuestas de dos maneras:Tenga en cuenta que si un campo es (o un método devuelve)
null
, no se escribirá en la salida.Ahora, si
@XmlElement
se usa, las cosas no públicas (podrían ser campos o métodos getter) también se pueden ordenar.Pero las dos formas, es decir, los campos y los métodos getter, no deben entrar en conflicto entre sí. De lo contrario, obtienes la excepción .
fuente