java xml - Jaxb, Class имеет два свойства с тем же именем




to map (14)

с jaxb, я пытаюсь прочитать XML-файл, интересны только несколько элементов в 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

я не понимаю эту ошибку

edit: я использую jaxb-impl-2.1.12

ok теперь у меня нет никакой ошибки, но когда я проверяю свой объект, timeSeries имеет значение null ...

поэтому, возможно, у jaxb есть проблема с flx?


Answers

просто объявите переменные-члены частными в классе, который вы хотите преобразовать в XML. Счастливое кодирование


Ваш JAXB рассматривает как метод getTimeSeries() и член timeSeries . Вы не говорите, какую реализацию JAXB вы используете или ее конфигурацию, но исключение довольно понятно.

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

а также

на защищенном java.util.List testjaxp.ModeleREP.timeSeries

Вам нужно настроить материал JAXB для использования аннотаций (в соответствии с вашим @XmlElement(name="TimeSeries") ) и игнорировать общедоступные методы.


Быстрый и простой способ устранить эту проблему - удалить @XmlElement(name="TimeSeries") из верхней части инструкции объявления переменной, protected List<TimeSeries> timeSeries; в верхнюю часть его получателя, public List<TimeSeries> getTimeSeries() .

Таким образом, ваш класс ModeleREP будет выглядеть так:

@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;
  }
}

Надеюсь, поможет!


просто добавил это в мой класс

@XmlAccessorType(XmlAccessType.FIELD)

работал как чам


Он будет работать, когда вы помещаете свою аннотацию перед геттерами и удаляете ее из защищенных атрибутов:

protected String codingScheme;

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

Я также столкнулся с такой проблемой, и я это установил.

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

Это будет работать на 100%


С той же проблемой, с которой я столкнулся, я добавил

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)

и теперь он работает.


Я также видел некоторые похожие проблемы, подобные этому.

Я думаю, это из-за того места, где мы используем аннотацию @XMLElement в классе (bean).

И я думаю, JAXB (обработчик аннотации) рассматривает метод поля члена и геттера того же элемента поля, что и разные свойства, когда мы используем аннотацию @XMLElement на уровне поля и генерируем исключение IllegalAnnotationExceptions .

Сообщение об исключении:

Класс имеет два свойства с тем же именем "timeSeries"

В методе Геттера:

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

На поле участника:

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

Решение. Вместо использования @XmlElement в поле используйте его в методе getter .


Я просто столкнулся с этой проблемой и решил ее.

Источником проблемы является то, что у вас есть как XmlAccessType.FIELD, так и пары геттеров и сеттеров. Решение заключается в удалении сеттеров и добавлении конструктора по умолчанию и конструктора, который принимает все поля.


Вам также нужно настроить класс ModeleREP с помощью @XmlAccessorType(XmlAccessType.FIELD) как это было с классом TimeSeries .

Посмотрите на OOXS



Это два свойства, на которые смотрит JAXB.

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

а также

protected java.util.List testjaxp.ModeleREP.timeSeries

Этого можно избежать, используя аннотацию JAXB при методе get, как указано ниже.

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

Вы не указали, какую версию JAXB-IMPL вы используете, но как только у меня возникла такая же проблема (с jaxb-impl 2.0.5), и она была решена с использованием аннотации на уровне получателя вместо того, чтобы использовать ее на уровне участника.


Томас Петричек правильно понял основы; Вы могли бы также хотеть взглянуть на письмо Фила Уодлера о «проблеме выражения».

Есть еще две причины, по которым некоторые из нас предпочитают алгебраические типы данных наследованию:

  • Используя алгебраические типы данных, компилятор может (и делает) сказать вам, если вы забыли регистр или случай избыточен. Эта способность особенно полезна, когда над вещами гораздо больше операций, чем с разными вещами . (Например, гораздо больше функций, чем алгебраических типов данных, или гораздо больше методов, чем конструкторов ОО.) В объектно-ориентированном языке, если вы оставите метод вне подкласса, компилятор не сможет определить, является ли это ошибкой или вы намеревались наследовать метод суперкласса без изменений.

  • Этот является более субъективным: многие люди отмечают, что если наследование используется правильно и агрессивно, реализация алгоритма может быть легко размазана по более чем полудюжине классов, и даже с хорошим браузером классов может быть трудно следовать логика программы (поток данных и поток управления). Без классного браузера у вас нет шансов. Если вы хотите увидеть хороший пример, попробуйте реализовать bignums в Smalltalk с автоматическим переключением на bignums при переполнении. Это отличная абстракция, но язык усложняет реализацию. Используя функции на алгебраических типах данных, логика вашего алгоритма обычно находится в одном месте, или, если она разделена, она разделяется на функции, которые имеют контракты, которые легко понять.

PS Что ты читаешь? Я не знаю ни одного ответственного человека, который сказал бы: «АТП хорошие; ОО плохие».





java xml jaxb