с jaxb я пытаюсь прочитать файл xml, интересны только несколько элементов в файле xml, поэтому я хотел бы пропустить многие элементы
xml я пытаюсь прочитать
<?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>
мой класс
@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;
}
}
когда я пытаюсь прочитать файл xlm, я получаю
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
я не понимаю эту ошибку
изменить: я использую jaxb-impl-2.1.12
хорошо, теперь у меня нет ошибок, но когда я проверяю свой объект, timeSeries имеет значение null ...
так, может быть, у jaxb проблемы с flx?
@XmlAccessorType(XmlAccessType.FIELD)
аннотацииВы не указали, какую версию JAXB-IMPL вы используете, но однажды у меня возникла такая же проблема (с jaxb-impl 2.0.5), и я решил ее, используя аннотацию на уровне получателя вместо того, чтобы использовать ее на уровне члена.
источник
Я также видел несколько похожих проблем.
Я думаю, это из-за того места, где мы используем аннотацию « @XMLElement » в классе (bean).
И я думаю, что JAXB (обработчик аннотаций) рассматривает поле члена и метод получения одного и того же элемента поля как разные свойства, когда мы используем аннотацию @XMLElement на уровне поля и выдает исключение IllegalAnnotationExceptions .
Сообщение об исключении:
В методе получения:
В поле участника:
Решение: Вместо того чтобы использовать @XmlElement в поле , использовать его в геттерном методе.
источник
только что добавил это в свой класс
работал как чам
источник
Есть несколько решений, но в основном, если вы комментируете объявление переменной, вам нужно
@XmlAccessorType(XmlAccessType.FIELD)
, но если вы предпочитаете аннотировать метод get или set, тогда вы этого не сделаете.Итак, вы можете:
Или:
источник
Ваш JAXB смотрит и на
getTimeSeries()
метод, и на членtimeSeries
. Вы не говорите, какую реализацию JAXB вы используете или ее конфигурацию, но исключение довольно очевидно.и
Вам необходимо настроить ваш материал JAXB для использования аннотаций (в соответствии с вашими
@XmlElement(name="TimeSeries")
) и игнорирования общедоступных методов.источник
Вам нужно настроить class
ModeleREP
так же,@XmlAccessorType(XmlAccessType.FIELD)
как вы это делали с classTimeSeries
.Посмотри на OOXS
источник
Если мы воспользуемся приведенными ниже аннотациями и удалим аннотацию «@XmlElement», код должен работать правильно, и результирующий XML будет иметь имена элементов, аналогичные членам класса.
В случае, если действительно требуется использование «@XmlElement», определите его как уровень поля, и код должен работать идеально. Не определяйте аннотацию в верхней части метода получения.
Пробовал оба вышеупомянутых подхода и решил проблему.
источник
«Класс имеет два свойства с одинаковым именем, исключение» может произойти, когда у вас есть член класса x с публичным уровнем доступа и геттер / сеттер для того же члена.
Как правило, не рекомендуется использовать общедоступный уровень доступа вместе с геттерами и сеттерами.
Проверьте это для более подробной информации: Public property VS Private property with getter?
Чтобы исправить это:
источник
Это два свойства, на которые смотрит JAXB.
и
Этого можно избежать, используя аннотацию JAXB в методе get, как указано ниже.
источник
просто объявите переменные-члены частными в классе, который вы хотите преобразовать в XML. Удачного кодирования
источник
Та же проблема, с которой я столкнулся, я добавил
и теперь он работает.
источник
Это сработает, если вы поместите аннотацию перед геттерами и удалите ее из защищенных атрибутов:
источник
Я только что столкнулся с этой проблемой и решил ее.
Источник проблемы в том, что у вас есть как XmlAccessType.FIELD, так и пары геттеров и сеттеров. Решение состоит в том, чтобы удалить сеттеры и добавить конструктор по умолчанию и конструктор, который принимает все поля.
источник
У меня был класс обслуживания с подписью ниже "
При запуске я получил ту же ошибку для
FetchIQAStatusResponseVO
полей. Я просто добавил строку поверхFetchIQAStatusResponseVO
:и это решило проблему.
источник
ModeleREP#getTimeSeries()
должны быть с@Transient
аннотацией. Это поможет.источник
Аннотирование с помощью
@XmlTransient
решает эту проблемуПосмотрите http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html для получения дополнительной информации.
источник
Быстрый и простой способ решить эту проблему - удалить
@XmlElement(name="TimeSeries")
из верхней части оператора объявления переменнойprotected List<TimeSeries> timeSeries;
верхнюю часть его получателяpublic List<TimeSeries> getTimeSeries()
.Таким образом, ваш
ModeleREP
класс будет выглядеть так:Надеюсь, поможет!
источник
Я провел метод проб и ошибок и пришел к выводу, что вам нужно использовать либо оба,
@XMLElement
либо@XmlAccessorType(XmlAccessType.FIELD)
.Когда какой использовать?
случай 1 : Если ваши имена полей и имя элемента, которое вы хотите использовать в XML-файле, отличаются, вам необходимо использовать
@XMLElement(name="elementName")
. Поскольку это свяжет поля с этим именем элемента и отобразится в файле XML.случай 2 : если имена полей и имя соответствующего элемента в xml одинаковы, вы можете просто использовать
@XmlAccessorType(XmlAccessType.FIELD)
источник
Было дано много решений, и @Sriram и @ptomli также вкратце коснулись внутреннего устройства. Я просто хочу добавить несколько ссылок на исходный код, чтобы помочь понять, что происходит под капотом.
По умолчанию (т.е. никакие дополнительные аннотации не используются, кроме
@XmlRootElement
корневого класса), JABX пытается упорядочить объекты, представленные двумя способами:Обратите внимание, что если поле есть (или метод возвращается)
null
, оно не будет записано в вывод.Теперь, если
@XmlElement
используется, закрытые объекты (например, поля или методы получения) также могут быть упорядочены.Но два способа, то есть поля и методы-получатели, не должны конфликтовать друг с другом. В противном случае вы получите исключение .
источник