जैक्सब, क्लास में एक ही नाम के दो गुण हैं


120

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

मैं इस त्रुटि को नहीं समझता

संपादित करें: मैं jaxb-impl-2.1.12 का उपयोग करता हूं

ठीक है अब मेरे पास कोई त्रुटि नहीं है, लेकिन जब मैं अपनी वस्तु की जांच करता हूं, तो समय सीमा शून्य है ...

तो शायद jaxb flx के साथ समस्या है?

जवाबों:


204

मुझे भी इस तरह की समस्या का सामना करना पड़ा और मैंने इसे सेट किया।

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

यह 100% काम करेगा


8
मेरी भी यही समस्या थी। और यहां तक ​​कि यह तब काम करता है जब हम केवल @XmlAccessorType (XmlAccessType.FIELD) जोड़ते हैं
राम दत्त शुक्ला

2
मैं द्वारा समस्या हल हो जाती हटाने के@XmlAccessorType(XmlAccessType.FIELD) एनोटेशन
हंस Wouters

सुनने में अजीब लगता है, लेकिन मैंने इस अपवाद से भी छुटकारा पा लिया है, केवल एनोटेशन \ @XmlRootElement @XmlAccessorType (XmlAccessType.FIELD) की जोड़ी को घटाकर
एलेक्स InTechno

3
JAXB एनोटेशन के लिए इनर वर्गों के साथ एक ही मुद्दे में भाग गया। आंतरिक कक्षाओं पर @XmlAccessorType (XmlAccessType.FIELD) रखने पर काम हुआ!
शोएब खान

बहुत बहुत धन्यवाद।
लोम्बोक के

25

आपने यह निर्दिष्ट नहीं किया कि आप JAXB-IMPL संस्करण का उपयोग क्या कर रहे हैं, लेकिन एक बार मुझे भी यही समस्या थी (jaxb-impl 2.0.5 के साथ) और इसे सदस्य स्तर पर उपयोग करने के बजाय गेट्टर स्तर पर एनोटेशन का उपयोग करके हल किया।


यह सही है मैंने सिर्फ सदस्य से एनोटेशन को हटाया और इसे सेटर स्तर पर रखा और यह काम कर गया।
वरुण

22

मैंने इस तरह के कुछ अनजाने मुद्दों को भी देखा है।

मुझे लगता है, यह उस जगह की वजह से है जहां हम " (सेम) वर्ग में " @XMLElement " एनोटेशन का उपयोग करते हैं ।

और मुझे लगता है, JAXB (एनोटेशन प्रोसेसर) एक ही फील्ड एलिमेंट के मेंबर फील्ड और गेट्टर मेथड को अलग-अलग प्रॉपर्टीज मानता है , जब हम फील्ड लेवल पर @XMlelement एनोटेशन का इस्तेमाल करते हैं और IllegalAnationation अपवाद अपवादों को फेंक देते हैं।

अपवाद संदेश:

क्लास में एक ही नाम के दो गुण हैं "timeSeries"

गेट्टर विधि पर:

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

सदस्य क्षेत्र में:

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

समाधान: उपयोग करने के बजाय @XmlElement में क्षेत्र , में उपयोग गेटर विधि।


16

बस इसे मेरी कक्षा में जोड़ा गया

@XmlAccessorType(XmlAccessType.FIELD)

एक चाम की तरह काम किया


लुम्बोक के @Data एनोटेशन के साथ भी काम करता है।
digz6666

16

वहाँ कई समाधान हैं, लेकिन मूल रूप से यदि आप चर घोषणा पर एनोटेट करते हैं तो आपको आवश्यकता है @XmlAccessorType(XmlAccessType.FIELD) करते हैं, , लेकिन यदि आप किसी गेट-या सेट-विधि को एनोटेट करना पसंद करते हैं तो आप नहीं करते हैं।

तो आप कर सकते हैं:

@XmlRootElement(name="MY_CLASS_A")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClassA
{
    @XmlElement(name = "STATUS")   
    private int status;
   //.. and so on
}

या:

@XmlRootElement(name="MY_CLASS_A")
public class MyClassA
{
    private int status;

    @XmlElement(name = "STATUS")         
    public int getStatus()
    {
    }
}

आश्चर्यजनक। धन्यवाद :) +1
अनीश बी।

11

आपका JAXB getTimeSeries()विधि और सदस्य दोनों को देख रहा है timeSeries। आप यह नहीं कहते हैं कि आप किस JAXB कार्यान्वयन का उपयोग कर रहे हैं, या इसका कॉन्फ़िगरेशन, लेकिन अपवाद बिल्कुल स्पष्ट है।

जनता में java.util.ist testjaxp.ModeleREP.getTimeSeries ()

तथा

संरक्षित java.util.ist testjaxp.ModeleREP.timeSeries पर

एनोटेशन (अपने अनुसार @XmlElement(name="TimeSeries")) का उपयोग करने और सार्वजनिक तरीकों को अनदेखा करने के लिए आपको JAXB सामान को कॉन्फ़िगर करने की आवश्यकता है ।


मैं पहले से ही करता हूं: @XmlElement (नाम = "टाइमसरीज") संरक्षित सूची <TimeSeries> timeSeries;
Redfox26

4
मैं भी बदल (XmlAccessType.FIELD) (XmlAccessType.NONE), मैं सदस्य स्तर पर XmlElement रख सकते हैं
redfox26

मैं भी चर को @XmlTransient जोड़ने की जरूरत
HomeIsWhereThePcIs

8

आप कॉन्फ़िगर वर्ग की जरूरत है ModeleREPऔर साथ ही साथ @XmlAccessorType(XmlAccessType.FIELD)के रूप में आप वर्ग के साथ किया था TimeSeries

OOXS को देखो


8

यदि हम नीचे दिए गए एनोटेशन का उपयोग करते हैं और "@ XmlElement" एनोटेशन को हटाते हैं, तो कोड को ठीक से काम करना चाहिए और परिणामी XML में कक्षा के सदस्य के समान तत्व नाम होंगे।

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

"@ XmlElement" के उपयोग की वास्तव में आवश्यकता है, कृपया इसे फ़ील्ड स्तर के रूप में परिभाषित करें और कोड पूरी तरह से काम करे। गेटटर विधि के शीर्ष पर एनोटेशन को परिभाषित न करें।

ऊपर वर्णित दोनों तरीकों की कोशिश की थी और इस मुद्दे को ठीक करने के लिए मिला।


7

"क्लास में एक ही नाम अपवाद के दो गुण हैं" तब हो सकता है जब आपके पास पब्लिक एक्सेस लेवल के साथ क्लास मेंबर x हो और उसी मेंबर के लिए गेटटर / सेटर हो।

अंगूठे के एक जावा नियम के रूप में, इसे सार्वजनिक उपयोग करने की अनुशंसा नहीं की जाती है गेटर्स और सेटर के साथ पहुंच स्तर ।

अधिक जानकारी के लिए इसे देखें: सार्वजनिक संपत्ति वी.एस.

इसे ठीक करने के लिए:

  1. अपने सदस्य के पहुँच स्तर को निजी में बदलें और अपना गेटटर / सेटर रखें
  2. सदस्य के गेटटर और सेटर को हटा दें

6

ये दो गुण हैं JAXB देख रहे हैं।

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

तथा

protected java.util.List testjaxp.ModeleREP.timeSeries

नीचे बताए गए तरीके से प्राप्त विधि पर JAXB एनोटेशन का उपयोग करके इससे बचा जा सकता है।

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

5

जिस वर्ग को आप XML में परिवर्तित करना चाहते हैं, उसे केवल सदस्य चर घोषित करें। खुश कोडिंग


यह स्वीकृत समाधान होना चाहिए। यदि आप अपने सदस्य चर को सार्वजनिक घोषित करते हैं, तो JABX इसे गेटटर / सेटर एनोटेट विधियों के अलावा पार्स करेगा और अपवाद को थूक देगा। यह एक महान उदाहरण है जहां जैक्स लाइब्रेरी डिजाइनर (एस) लचीलापन बनाने की कोशिश कर रहे प्रतिबिंब पर एक अतिरिक्त मील गए और अमान्य कॉन्फ़िगरेशन को सुविधाजनक बनाने में समाप्त हो गए। मैंने उस समय कोड की एक पंक्ति को बदलकर, सदस्य चर पर वापस आकर समस्या को अपने आप ठीक कर लिया।
भंवर

4

उसी समस्या का सामना करना पड़ा, मैंने जोड़ा

@XmlRootElement(name="yourRootElementName")

@XmlAccessorType(XmlAccessType.FIELD)

और अब यह काम कर रहा है।


3

यह काम करेगा जब आप अपने एनोटेशन को गेटर्स से पहले रखें, और इसे संरक्षित विशेषताओं से हटा दें:

protected String codingScheme;

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

मैं भी उसी समस्या में चल रहा हूं। मैंने यह भी देखा है कि जब एनोटेशन को उन विशेषताओं के रूप में चिह्नित किया जाता है जो मैं इसे देखता हूं। क्या इसका मतलब यह है कि हमेशा इसे गेटर्स से पहले रखा जाना चाहिए?
पवन दित्तकवी

@ पवन हां मुझे ऐसा लगता है। अन्यथा, यह मुझे एक ही समस्याओं को आप से कारण बनता है
लिलिया

2

मैंने अभी इस समस्या में भाग लिया है और इसे हल किया है।

समस्या का स्रोत यह है कि आपके पास XmlAccessType.FIELD और गेटर्स और सेटर्स दोनों हैं। समाधान के लिए बस्तियों को हटाने और एक डिफ़ॉल्ट कंस्ट्रक्टर और एक निर्माता को जोड़ना है जो सभी फ़ील्ड लेता है।


मेरे पास एक ही त्रुटि थी और आपके द्वारा उल्लिखित एनोटेशन ने इसे हल कर दिया, धन्यवाद!
गृहर्यब्रह्म

1

मेरे पास नीचे हस्ताक्षर के साथ एक सेवा वर्ग था "

@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {

चलाने पर मुझे FetchIQAStatusResponseVOखेतों के लिए एक ही त्रुटि मिली । मैंने अभी इसके ऊपर एक लाइन जोड़ी FetchIQAStatusResponseVO:

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

और इस मुद्दे को हल किया।


1

ModeleREP#getTimeSeries()@Transientएनोटेशन के साथ रहना होगा । इससे मदद मिलेगी।


0

@XmlTransientउस मुद्दे को हल करने के साथ एनोटेट करना

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

पर देखो http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html अधिक जानकारी के लिए


1
मुझे लगता है कि यह एक समाधान से अधिक हैक है। यह jaxb को विधि को अनदेखा करने के लिए कहता है, इसके बजाय यह जागरूक करने के लिए कि यह एक ही बात है।
हंस वाउचर

हैक करें या न करें यह किसी चीज़ के आसपास पाने के लिए सबसे अच्छा समाधान है जिसे बग के कुछ भी कम के रूप में वर्णित नहीं किया जा सकता है, मैंने @XmlAccessorType (XmlAccessType.FIELD) का उपयोग किया था जिसे ज्यादातर अनदेखा किया गया था और प्रत्येक संपत्ति में @XmlTient को जोड़ना एकमात्र तरीका था इस समस्या को सुधारें। धन्यवाद!
राल्फ रिटोच

0

इस मुद्दे को ठीक करने का एक त्वरित और सरल तरीका है @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;
  }
}

आशा करता हूँ की ये काम करेगा!


आप 'एक सरल तरीका' का उल्लेख करते हैं। जिज्ञासु, वहाँ इस से बाहर कोई अन्य तरीका है - nay अन्य एनोटेशन कि leveraged किया जा सकता है ?.
पवन दित्तकवी

0

मैं परीक्षण और त्रुटि किया था और निष्कर्ष यह है कि, आप केवल दोनों में से किसी का उपयोग करने के मिल गया @XMLElementया @XmlAccessorType(XmlAccessType.FIELD)

कब कौन सा उपयोग करें?

स्थिति 1 : यदि आपके क्षेत्र के नाम और तत्व का नाम जिसे आप xml फ़ाइल में उपयोग करना चाहते हैं, अलग हैं तो आपको उपयोग करना होगा @XMLElement(name="elementName")। जैसा कि यह उस तत्व नाम और एक्सएमएल फ़ाइल में प्रदर्शन के साथ फ़ील्ड्स को बांध देगा।

स्थिति 2 : यदि फ़ील्ड के नाम और संबंधित तत्व का नाम xml में दोनों समान हैं, तो आप बस उपयोग कर सकते हैं@XmlAccessorType(XmlAccessType.FIELD)


0

कई समाधान दिए गए हैं, और इंटर्ल्स को संक्षेप में @ श्रीराम और @प्टोमली द्वारा भी छुआ गया है। मैं बस हुड के नीचे क्या हो रहा है यह समझने में मदद करने के लिए स्रोत कोड में कुछ संदर्भ जोड़ना चाहता हूं।

डिफ़ॉल्ट रूप से (अर्थात @XmlRootElementरूट वर्ग को छोड़कर सभी में कोई अतिरिक्त एनोटेशन का उपयोग नहीं किया जाता है ), JABX दो चीजों को उजागर करने वाली मार्शलों की कोशिश करता है:

  1. सार्वजनिक क्षेत्र
  2. गेटर विधियाँ जिनका नाम सम्मेलन के नाम पर रखा गया है और उनके पास एक सेटर विधि है।

ध्यान दें कि यदि कोई फ़ील्ड है (या विधि रिटर्न) null , तो इसे आउटपुट में नहीं लिखा जाएगा।

अब अगर @XmlElement उपयोग किया जाता है, तो गैर-सार्वजनिक चीजें (फ़ील्ड्स या गेट्टर मेथड हो सकती हैं) को भी मार्शेल्ड किया जा सकता है।

लेकिन दो तरीकों, अर्थात् फ़ील्ड्स और गेट्टर-विधियों, को एक दूसरे के साथ संघर्ष नहीं करना चाहिए। अन्यथा आपको अपवाद मिलता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.