2011-04-27 6 views
11

ऐसा प्रतीत होता है कि अगर उस संपत्ति के एक्सेसर को के बजाय isProperty() के रूप में परिभाषित किया गया है तो डोजर एक बूलियन प्रॉपर्टी को मैप नहीं करेगा।डोजर बूलियन प्रॉपर्टी मैपिंग

import org.dozer.* 

class ProductCommand { 
    Boolean foo 
} 

public class ProductDto { 

    private Boolean foo;   

    public Boolean isFoo() { this.foo }  
    public void setFoo(Boolean p0) { this.foo = p0 }   
} 

def mapper = new DozerBeanMapper() 

dto = new ProductDto(foo: true) 
assert dto.isFoo() 

ProductCommand mappedCmd = mapper.map(dto, ProductCommand) 
assert mappedCmd.foo 

अंतिम सीमा पर दावे विफल रहता है:

निम्नलिखित ग्रूवी स्क्रिप्ट समस्या को दिखाता है। हालांकि, अगर मैं ProductDto.isFoo() से ProductDto.getFoo() का नाम बदलता हूं तो यह गुजरता है।

क्या कोई ध्वज/विकल्प है जो मैं डोज़र मैपिंग फ़ाइल में सेट कर सकता हूं जो इसे is या get बूलियन गुणों के लिए एक्सेसर का उपयोग करने के लिए निर्देश देगा? वैकल्पिक रूप से, मैं प्रत्येक बुलियन संपत्ति के लिए एक कस्टम नियम जोड़ सकता हूं, लेकिन यह बहुत आकर्षक नहीं है।

हालांकि ऊपर दिया गया उदाहरण ग्रोवी में लिखा गया है, मेरे पास विश्वास करने का कोई कारण नहीं है कि समान व्यवहार समकक्ष जावा कोड द्वारा प्रदर्शित नहीं किया जाएगा।

ये डीटीओ जेएक्सबी द्वारा उत्पन्न होते हैं (जो बूलियन के लिए "प्राप्तकर्ता" एक्सेसर के बजाय "है" एक्सेसर उत्पन्न करता है, इसलिए मैं एक्सेसर्स का नाम बदल नहीं सकता। मैं डोज़र 5.3.2 का उपयोग कर रहा हूँ।

+0

आप JAXB के लिए उपयोग कर रहे हैं किसी भी मौके से अपने डीटीओ उत्पन्न करें? – artbristol

+0

हाँ मैं हूं, क्या कोई तरीका है जिससे आप इसे एक्सेसर्स प्राप्त कर सकते हैं? –

+0

ध्यान दें कि डोज़र केवल इस तरह से व्यवहार करता है जब 'है' विधि में 'बूलियन' टाइप होता है - यह 'बूलियन isFoo()' विधियों को ठीक करता है। –

उत्तर

3

यह जेएक्सबी में एक बग है, छोटे बी boolean में isFoo() होना चाहिए। आप या तो जेएक्सबी के बाद के संस्करणों के साथ -enableIntrospection विकल्प का उपयोग कर सकते हैं, या पुराने बूलेन गेटर xjc प्लगइन का उपयोग कर सकते हैं http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html

+0

धन्यवाद, कोई विचार जहां मैं इस प्लगइन को ढूंढ सकता हूं (उपरोक्त लिंक काम नहीं करता है) और मैं इसे एंटी 'wsimport' कार्य के साथ कैसे उपयोग करता हूं? –

+0

क्षमा करें, लिंक को गड़बड़ कर दिया। अब तय – artbristol

+0

मुझे डर है कि मैं इसे मैवेन – artbristol

8

क्या आप इसका उपयोग करने के लिए कस्टम गेटर विधि का उपयोग कर सकते हैं।

यहाँ उदाहरण मानचित्रण (डोजर-मैपिंग फ़ाइल में यह लिखें)

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
<field> 
    <a get-method="isFoo">foo</a> 
    <b>foo</b> 
</field> 
</mapping> 

तो अब डोजर पूर्वनिर्धारित getFoo के बजाय isFoo का उपयोग करेगा है। आशा है कि यह आपके लिए काम करता है। :)

0

वहाँ भी सही डोजर मानचित्रण (मेरी राय में साफ) को प्राप्त करने का एक और तरीका है:

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
    <field> 
     <a is-accessible=”true”>foo</a> 
     <b is-accessible=”true”>foo</b> 
    </field> 
</mapping> 

या जिस तरह से पहले से ही पहले ही उल्लेख किया:

<mapping> 
    <class-a>ProductDto</class-a> 
    <class-b>ProductCommand</class-b> 
    <field> 
     <a get-method=”isFoo”>foo</a> 
     <b>foo</b> 
    </field> 
</mapping>