2013-02-13 13 views
5

का उपयोग कर तो मेरी समस्या है। मुझे एक एक्सएसडी दिया गया है जिस पर मेरी जेनरेट की गई एक्सएमएल फ़ाइल का पालन करना चाहिए। org.apache.cxf.cxf-xjc-plugin मेवेन प्लगइन और बाहरी बाध्यकारी फ़ाइल का उपयोग करके मैं स्रोत कोड उत्पन्न करता हूं। लेकिन जब मैं मार्शल की कोशिश कर रहा हूं तो मेरी ऑब्जेक्ट जेनरेट एक्सएमएल मेरी आवश्यकताओं को पूरा नहीं करता है।BigDecimal के लिए JAXB marshalling fractionDigits

मेरे XSD शामिल निम्नलिखित:

<xsd:element maxOccurs="1" minOccurs="0" name="amount"> 
    <xsd:simpleType> 
    <xsd:restriction base="xsd:decimal"> 
     <xsd:totalDigits value="13" /> 
     <xsd:fractionDigits value="2" /> 
    </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 
... 
<xsd:element maxOccurs="1" minOccurs="0" name="rate"> 
    <xsd:simpleType> 
    <xsd:restriction base="xsd:decimal"> 
     <xsd:totalDigits value="8" /> 
     <xsd:fractionDigits value="5" /> 
    </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 

और XML के उत्पन्न टुकड़ा इस तरह दिखता है:

<amount>109.50</amount> 
... 
<rate>10.25000</rate> 
:

<amount>109.5</amount> 
... 
<rate>10.25</rate> 

जब मैं इसे होने की उम्मीद कर रहा था

क्या इस समस्या को साफ तरीके से हल करने का कोई तरीका है?

मैं प्रत्येक totalDigits, fractionDigits संयोजन के लिए कई एडेप्टर लिखना पसंद नहीं करूंगा। और चूंकि एक्सएसडी परिवर्तन के अधीन है, इसलिए मैं जेनरेट किए गए स्रोत कोड को छूना चाहता हूं।

+3

दशमलव डेटाप्रकार पर W3C दस्तावेज़ कहते हैं 'fractionDigits' दशमलव विभाजक के बाद अंकों की संख्या पर ऊपरी सीमा निर्दिष्ट करता है। दाएं हाथ के शून्य अनुपस्थित होने पर डेटा को पढ़ने के लिए इससे कोई फर्क नहीं पड़ता। उपयोग केस क्या है जिसके लिए शून्य पैडिंग की आवश्यकता होती है? –

+0

@Jim (जेनरेशन) मेरे जेनरेट किए गए एक्सएमएल फ़ाइल को पार्स करने के लिए शून्य पैडिंग की आवश्यकता है ;-) – Jasper

+0

क्या आप मेरे उत्तर में 'सटीकडिमल' का उपयोग कर सकते हैं? –

उत्तर

5

इस उपयोग के मामले में आपको XmlAdapter का उपयोग करने की आवश्यकता होगी। नीचे एक नमूना बाध्यकारी फ़ाइल है जो आपको उत्पन्न करने में आपकी सहायता करेगी। तर्क DecimalFormatter कक्षा में निहित होगा जिसमें सभी आवश्यक आवश्यक प्रारूपों के लिए विधियां शामिल हैं।

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 
    <jxb:bindings schemaLocation="schema.xsd"> 
     <jxb:bindings node="//xs:element[@name='amount']"> 
      <jxb:property> 
       <jxb:baseType> 
        <jxb:javaType name="java.math.BigDecimal" 
         parseMethod="org.example.DecimalFormatter.parseDecimal" 
         printMethod="org.example.DecimalFormatter.printDecimal_2Places" /> 
       </jxb:baseType> 
      </jxb:property> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:element[@name='rate']"> 
      <jxb:property> 
       <jxb:baseType> 
        <jxb:javaType name="java.math.BigDecimal" 
         parseMethod="org.example.DecimalFormatter.parseDecimal" 
         printMethod="org.example.DecimalFormatter.printDecimal_5Places" /> 
       </jxb:baseType> 
      </jxb:property> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

अधिक जानकारी के लिए

+0

मैं वास्तव में यह अभी कर रहा हूं, लेकिन मैं एक * क्लीनर * समाधान खोजने की कोशिश कर रहा हूं क्योंकि इसके लिए मुझे प्रत्येक 'कुलडिजिट्स '-' fractionDigits' संयोजन 'के लिए' printMethod' बनाने की आवश्यकता है। – Jasper

0

आप XSD precisionDecimal प्रकार here दस्तावेज का उपयोग करने को बदल सकते हैं, तो आप minScale और maxScale पहलुओं में एक ही मान पर सेट उपयोग करने में सक्षम हो सकता है।

+0

[इस उत्तर] के अनुसार (http://stackoverflow.com/a/4901771/321366), जेएक्सबी स्पेक एक्सएमएल स्कीमा 1.1 को जावा में कनवर्ट करने में शामिल नहीं है।और एक्सजेसी निम्नलिखित अपवाद को फेंकता है '[ERROR] src-resol: जब मैं इसे आज़माता हूं तो' xsd: precisionDecimal 'नाम को (n)' टाइप परिभाषा 'घटक' में हल नहीं कर सकता। – Jasper

0

मैं क्या संभवतः अनुगामी शून्य बनाए रखने के द्वारा प्राप्त किया जा सकता है के रूप में उलझन में हूँ।

यदि पिछला शून्य संरक्षित करने के लिए महत्वपूर्ण है, तो किसी संख्या के बजाय स्ट्रिंग मान का उपयोग करें और इसकी चौड़ाई और दशमलव निर्दिष्ट करने के लिए विशेषताओं का उपयोग करें।

किसी भी मामले में, पीछे की ओर शून्य इन मानों में से किसी भी का उपयोग करके गणनाओं को कभी प्रभावित नहीं करेगी, और एकमात्र तरीका आप उन्हें पेश करने में सक्षम होंगे, परिणाम को एक स्ट्रिंग में परिवर्तित करके और स्वयं को पैडिंग करके। कुछ कर रही मदद के लिए, जैसा कि आप देख सकते हैं ...

CXF client SOAP message formatting