2011-07-20 18 views
82

con jaxb, trato de leer un archivo XML solamente un elemento de pocos en el archivo XML son interesantes, por lo que me gustaría saltar muchas elementoJAXB, clase tiene dos propiedades del mismo nombre

xml content

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 trato de leer el archivo XLM me sale me sale

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

edición: yo uso jaxb-impl-2.1.12

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

así que tal vez jaxb parece tener problemas con flx?

Respuesta

10

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

en testjaxp.ModeleREP.getTimeSeries java.util.List pública()

y

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

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

+0

ya lo hago: @XmlElement (name = "TimeSeries") protected List timeSeries; – redfox26

+3

también cambio (XmlAccessType.FIELD) a (XmlAccessType.NONE), puedo mantener XmlElement en el nivel de miembro – redfox26

+0

gracias por explicar correctamente;) –

19

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

+0

Eso es correcto Acabo de eliminar la anotación del miembro y ponerla en el nivel de setter y trabajó. – Varun

3

Estas son las dos propiedades que JAXB está buscando.

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

y

protected java.util.List testjaxp.ModeleREP.timeSeries 

Esto se puede evitar mediante el uso de JAXB anotación al método get al igual que se mencionan a continuación.

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

es necesario configurar la clase ModeleREP así con @XmlAccessorType(XmlAccessType.FIELD) como lo hizo con la clase TimeSeries.

Tienes al vistazo a OOXS

145

que también se enfrentó a un problema como este y lo configuran.

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

Esto funcionará 100%

+4

Tuve el mismo problema. E incluso funciona cuando solo agregamos @XmlAccessorType (XmlAccessType.FIELD) –

+2

Resolví el problema mediante la eliminación de la anotación '@XmlAccessorType (XmlAccessType.FIELD)' –

+0

Suena extraño, pero también me deshice de esta excepción al reducir el par de anotaciones \ @XmlRootElement @XmlAccessorType (XmlAccessType.FIELD) a solo \ @XmlRootElement –

2

yo sólo he encontrado con este problema y lo resolvió.

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.

+0

Tuve el mismo error y la anotación que mencionaste lo resolvió, ¡gracias! – gyorgyabraham

12

También he visto algunos problemas similares a este.

Creo, que es debido a la lugar donde utilizamos el "@XMLElement" anotación en la clase (frijol).

Y pienso, la JAXB (procesador de anotación) considera que el método de obtención de campo & miembro del mismo elemento de campo como propiedades diferentes, cuando usamos la @XMLElement anotación en el nivel decampo y la lanza excepción IllegalAnnotationException excepción.

Mensaje de excepción:

Class tiene dos propiedades de los mismosnombre "TimeSeries"

En Getter Método:

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

En Campo de usuario:

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

Solución: En lugar de utilizar @XmlElement en el campo, lo utilizan en el método decaptador.

0

Anotando con @XmlTransient resuelve ese problema

@XmlTransient 
public void setTimeSeries(List<TimeSeries> timeSeries) { 
    this.timeSeries = timeSeries; 
} 

Mira http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html para más detalles

+1

Creo que esto es más un truco que una solución. Esto le dice a jaxb que ignore el método, en lugar de avisarle que es lo mismo. –

+0

Hackear o no esta es la mejor solución para evitar algo que no se puede describir como un error, utilicé @XmlAccessorType (XmlAccessType.FIELD) que fue ignorado en su mayoría y agregar @XmlTransient a cada propiedad fue la única manera para reparar este problema ¡Gracias! –

2

mismo problema que tuvimos, añadí

@XmlRootElement(name="yourRootElementName") 

@XmlAccessorType(XmlAccessType.FIELD) 

y ahora se está trabajando..

1

tuve una clase de servicio con la firma de la siguiente manera"

@WebMethod 
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) { 

En ejecución Tengo el mismo error para FetchIQAStatusResponseVO campos que acaba de agregar una línea en la parte superior de FetchIQAStatusResponseVO:

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

y esto resolvió el problema.

7

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

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

En caso de uso "@XmlElement" realmente se requiere, por favor definirlo como nivel de campo y el código debe funcionar a la perfección. No defina la anotación en la parte superior del método getter.

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

4

acaba de declarar las variables miembro a privado en la clase que desea convertir a XML. feliz de codificación

+1

esto es en realidad resolver mi problema –

+0

Esta debería ser la solución aceptada. Si declaras que la variable miembro es pública, JABX la analizará además de los métodos anotados getter/setter y escupirá la excepción. Es un gran ejemplo en el que los diseñadores de la biblioteca jabx se esforzaron un poco más para tratar de crear flexibilidad y terminaron facilitando configuraciones no válidas. Resolví el problema por mi cuenta cambiando una línea de código en ese momento, rastreando a la variable miembro. – Vortex

0

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

Así, 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 que ayude!

2

"clase tiene dos propiedades de la misma excepción nombre de" puede suceder cuando se tiene un miembro de la clase X con un nivel de acceso público y un captador/definidor para el mismo miembro.

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

Marque esta para más detalles: Public property VS Private property with getter?

Para corregir esto:

  1. cambiar el nivel de acceso de su miembro para privada y mantener su captador/definidor
  2. Retire getter y setter del miembro
4

acaba de agregar esto a mi clase

@XmlAccessorType(XmlAccessType.FIELD) 

funcionó como un Cham

0

que va a funcionar cuando usted pone su anotación antes de que los captadores, y sacarlo de los atributos protegidas:

protected String codingScheme; 

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