w jaxb próbuję odczytać plik xml tylko kilka elementów w pliku xml jest interesujących, więc chciałbym pominąć wiele elementów
xml próbuję przeczytać
<?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>
moja klasa
@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;
}
}
Kiedy próbuję odczytać plik XLM, otrzymuję
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
nie rozumiem tego błędu
edytuj: używam jaxb-impl-2.1.12
ok, teraz nie mam żadnego błędu, ale kiedy sprawdzam mój obiekt, timeSeries ma wartość null ...
więc może jaxb wydaje się mieć problem z flx?
@XmlAccessorType(XmlAccessType.FIELD)
adnotacjiNie określiłeś, jakiej wersji JAXB-IMPL używasz, ale kiedyś miałem ten sam problem (z jaxb-impl 2.0.5) i rozwiązałem go używając adnotacji na poziomie pobieracza zamiast używać go na poziomie elementu.
źródło
Widziałem też podobne problemy, takie jak ten.
Myślę, że dzieje się tak z powodu miejsca, w którym używamy adnotacji „ @XMLElement ” w klasie (fasola).
I myślę, że JAXB (procesor adnotacji) traktuje pole członkowskie i metodę pobierania tego samego elementu pola jako różne właściwości, kiedy używamy adnotacji @XMLElement na poziomie pola i rzucamy wyjątek IllegalAnnotationExceptions .
Komunikat o wyjątku:
W metodzie Gettera:
W polu członka:
Rozwiązanie: Zamiast używać @XmlElement w polu , użyj go w metodzie pobierającej .
źródło
właśnie dodałem to do mojej klasy
pracował jak cham
źródło
Istnieje wiele rozwiązań, ale zasadniczo, jeśli robisz adnotacje w deklaracji zmiennej, potrzebujesz
@XmlAccessorType(XmlAccessType.FIELD)
, ale jeśli wolisz adnotować metodę get lub set, to nie.Możesz więc:
Lub:
źródło
Twoje JAXB patrzy zarówno na
getTimeSeries()
metodę, jak i na członkatimeSeries
. Nie mówisz, której implementacji JAXB używasz, ani jej konfiguracji, ale wyjątek jest dość jasny.i
Musisz skonfigurować swoje rzeczy JAXB, aby używały adnotacji (zgodnie z twoimi
@XmlElement(name="TimeSeries")
) i ignorowały metody publiczne.źródło
Musisz skonfigurować klasę
ModeleREP
tak samo dobrze@XmlAccessorType(XmlAccessType.FIELD)
, jak w przypadku klasyTimeSeries
.Spójrz na OOXS
źródło
Jeśli użyjemy poniższych adnotacji i usuniemy adnotację „@XmlElement”, kod powinien działać poprawnie, a wynikowy XML miałby nazwy elementów podobne do elementu członkowskiego klasy.
W przypadku, gdy użycie „@XmlElement” jest naprawdę wymagane, należy zdefiniować go jako poziom pola, a kod powinien działać idealnie. Nie definiuj adnotacji na górze metody pobierającej.
Wypróbowałem oba powyższe podejścia i udało mi się rozwiązać problem.
źródło
„Klasa ma dwie właściwości o tej samej nazwie, wyjątek” może się zdarzyć, gdy masz członka klasy x z publicznym poziomem dostępu i funkcją pobierającą / ustawiającą dla tego samego członka.
Zgodnie z praktyczną zasadą Javy nie zaleca się używania publicznego poziomu dostępu razem z metodami pobierającymi i ustawiającymi.
Sprawdź to, aby uzyskać więcej informacji: Właściwość publiczna czy własność prywatna z funkcją getter?
Aby to naprawić:
źródło
To są dwie właściwości, na które patrzy JAXB.
i
Można tego uniknąć, używając adnotacji JAXB w metodzie get, tak jak wspomniano poniżej.
źródło
po prostu zadeklaruj zmienne składowe jako prywatne w klasie, którą chcesz przekonwertować na XML. Miłego kodowania
źródło
Ten sam problem, z jakim miałem do czynienia, dodałem
a teraz działa.
źródło
Będzie działać, gdy umieścisz adnotację przed pobierającymi i usuniesz ją z chronionych atrybutów:
źródło
Właśnie napotkałem ten problem i rozwiązałem go.
Źródłem problemu jest to, że masz zarówno XmlAccessType.FIELD, jak i pary metod pobierających i ustawiających. Rozwiązaniem jest usunięcie seterów i dodanie domyślnego konstruktora oraz konstruktora, który przyjmuje wszystkie pola.
źródło
Miałem klasę usług z podpisem jak poniżej "
W biegu mam ten sam błąd dla
FetchIQAStatusResponseVO
pól. Właśnie dodałem wiersz naFetchIQAStatusResponseVO
:i to rozwiązało problem.
źródło
ModeleREP#getTimeSeries()
musi być z@Transient
adnotacją. To by pomogło.źródło
Dodawanie adnotacji
@XmlTransient
rozwiązuje ten problemWięcej informacji można znaleźć pod adresem http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html
źródło
Szybkim i prostym sposobem rozwiązania tego problemu jest usunięcie
@XmlElement(name="TimeSeries")
instrukcji deklaracji zmiennejprotected List<TimeSeries> timeSeries;
z góry na górę jej metody pobierającej,public List<TimeSeries> getTimeSeries()
.Twoja
ModeleREP
klasa będzie więc wyglądać następująco:Mam nadzieję, że to pomoże!
źródło
Zrobiłem próbę i błąd i doszedłem do wniosku, że musisz użyć tylko jednego z nich
@XMLElement
lub@XmlAccessorType(XmlAccessType.FIELD)
.Kiedy używać którego?
Przypadek 1 : Jeśli nazwy pól i nazwa elementu, którego chcesz użyć w pliku xml są różne, musisz użyć
@XMLElement(name="elementName")
. Ponieważ spowoduje to powiązanie pól z nazwą elementu i wyświetlenie ich w pliku XML.Przypadek 2 : Jeśli nazwy pól i odpowiednia nazwa elementu w xml są takie same, możesz po prostu użyć
@XmlAccessorType(XmlAccessType.FIELD)
źródło
Podano wiele rozwiązań, a elementy wewnętrzne zostały krótko omówione przez @Sriram i @ptomli. Chcę tylko dodać kilka odniesień do kodu źródłowego, aby pomóc zrozumieć, co dzieje się pod maską.
Domyślnie (tj. Żadne dodatkowe adnotacje nie są używane w ogóle poza
@XmlRootElement
klasą główną), JABX próbuje organizować rzeczy ujawnione na dwa sposoby:Zauważ, że jeśli pole jest (lub zwraca metodę)
null
, nie zostanie ono zapisane w wyniku.Teraz, jeśli
@XmlElement
jest używany, rzeczy niepubliczne (mogą to być pola lub metody pobierające) mogą być również zorganizowane.Ale te dwa sposoby, tj. Pola i metody pobierające, nie mogą ze sobą kolidować. W przeciwnym razie otrzymasz wyjątek .
źródło