2010-12-15 11 views
5

उदाहरण ए काम क्यों करता है, उदाहरण के लिए बी एक "जेएक्सबी एनोटेशन एक विधि पर रखा गया है जो एक जेएक्सबी संपत्ति नहीं है" अपवाद?क्यों JAXB गेटर्स पर एनोटेशन की अनुमति नहीं देता है जो सभी एक ही सदस्य चर से खींचते हैं?

मैं वसंत एमवीसी के साथ जेएक्स-डब्ल्यूएस का उपयोग कर रहा हूं।

उदाहरण A

package com.casanosa2.permissions; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlType(name = "FooXMLMapper") 
public class FooXMLMapper implements IFoo { 

@XmlElement 
private final boolean propA; 

@XmlElement 
private final boolean propB; 

public FooMapper(IFoo foo) { 
    propA = foo.getPropA() 
    propB = foo.getPropB() 
} 

public FooMapper() { 
    propA = false; 
    propB = false; 
} 

@Override 
public boolean getPropA() { 
    return propA; 
} 

@Override 
public boolean getPropB() { 
    return propB; 
} 
} 

उदाहरण B

@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlType(name = "FooXMLMapper") 
public class FooXMLMapper { 

private final IFoo foo; 

public FooMapper() { 
    foo = new IFoo() { 

    @Override 
    public boolean getPropA() { 
    return false; 
    } 

    @Override 
    public boolean getPropB() { 
    return false; 
    } 

    }; 
} 

public FooXMLMapper(IFoo foo) { 
    this.foo = foo; 
} 

@XmlElement 
public boolean getPropA() { 
    return foo.getPropA(); 
} 

@XmlElement 
public boolean getPropB() { 
    return foo.getPropB(); 
} 
} 

उत्तर

5

मेरा मानना ​​है कि एक्सेसर्स को अनदेखा किया जाता है यदि यह सीधे आवृत्ति चर पर देख रहा है और आपके उदाहरण बी में सही नाम के वास्तविक आवृत्ति चर नहीं हैं। आपको क्लास पर @XmlAccessorType (XmlAccessType.NONE) और get/set विधियों पर @XmlElement और @XmlAttribute का उपयोग करने के लिए स्पष्ट रूप से बताना होगा। कम से कम, मैं अपने जेएक्सबी मैपिंग के साथ ऐसा कर रहा हूं।

+2

बर्नार्ड संपत्ति का उपयोग एक्सेस प्रकार के रूप में कर रहा है, इसलिए केवल प्राप्त/सेट विधि की जांच की जानी चाहिए। –

+0

आप सही थे, XmlAccessType.NONE को ठीक कर दिया। अब मेरे पास पहले से मौजूद डेटा को डुप्लिकेट करने वाले मूर्ख सदस्य चर नहीं हैं। :) –

+3

XmlAccessType.NONE काम करेगा, लेकिन यह सही नहीं है। कोई मतलब केवल नक्शा स्पष्ट रूप से एनोटेट किया गया है। यदि आप FIELD या प्रॉपर्टी का उपयोग करते हैं तो आप डिफॉल्टिंग का लाभ उठा सकते हैं। मुझे अभी भी विश्वास है कि आपकी समस्या में संपत्ति का उपयोग निर्दिष्ट है लेकिन एनोटेटिंग फ़ील्ड शामिल हैं। –

1

मेरा मानना ​​है कि यह एक उचित JAXB संपत्ति होने के लिए, आप उन्हें और साथ ही टिककर खेल के लिए setters की आवश्यकता होगी। (आपको शायद एक डिफ़ॉल्ट कन्स्ट्रक्टर की भी आवश्यकता होगी)।

+0

आपको दोनों प्राप्त करने और सेट करने की आवश्यकता नहीं है। केवल एक गेटर के साथ एक संपत्ति केवल लिखने के लिए माना जाएगा। केवल एक सेटटर वाली संपत्ति को केवल पढ़ने के लिए माना जाएगा। –

+0

@ ब्लाइज: अन्य रास्ता दौर, निश्चित रूप से? (जेएक्सबी मूल रूप से केवल एनोटेटेड विधियों के बारे में जानता है ...) –

+1

केवल गेटर = एक्सएमएल से संपत्ति लिखने के लिए केवल एक्सएमएल से पढ़ने के लिए कोई सेटटर नहीं है। एक्सएमएल से डेटा प्राप्त करने के लिए कोई गेटटर नहीं है क्योंकि केवल सेटर = एक्सएमएल से संपत्ति पढ़ें। –

2

मैंने अभी तक अपना कोड नहीं आजमाया है, लेकिन यह उदाहरण ए है जो गलत नहीं दिखता बी। उदाहरण में ए आपने संपत्ति का उपयोग निर्दिष्ट किया है (विधियों को प्राप्त/सेट करें) लेकिन फ़ील्ड (आवृत्ति चर) को एनोटेट किया है।

संबंधित मुद्दे

 संबंधित मुद्दे