2013-02-13 16 views
5

Quindi ecco il mio problema. Mi viene fornito un XSD a cui il mio file XML generato dovrebbe essere conforme. Utilizzando il plug-in org.apache.cxf.cxf-xjc-plugin e un file di bind esterno, genera il codice sorgente. Ma quando cerco il mio oggetto marshall, l'XML generato non soddisfa i miei requisiti.JAXB marshalling per BigDecimal usando fractionDigits

mio XSD contiene quanto segue:

<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> 

E il pezzo generato XML assomiglia a questo:

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

Mentre mi aspettavo che fosse:

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

C'è un modo per risolvere questo problema in modo pulito?

Preferisco non scrivere più adattatori per ogni singola combinazione totalDigits, fractionDigits. E poiché l'XSD è soggetto a modifiche, vorrei lasciare intatto il codice sorgente generato.

+3

Il documento del W3C sul tipo di dati decimale dice 'fractionDigits' specifica il limite superiore per il numero di cifre dopo il separatore decimale. Non dovrebbe importare nulla leggendo i dati se gli zeri della mano destra sono assenti. Qual è il caso d'uso che richiede lo zero padding? –

+0

@Jim L'applicazione (legacy) che analizza il mio file XML generato richiede lo zero padding ;-) – Jasper

+0

È possibile utilizzare 'precisionDecimal' come nella mia risposta? –

risposta

5

Per questo caso d'uso sarà necessario utilizzare XmlAdapter. Di seguito è riportato un file di esempio che ti aiuterà a generarli. La logica sarebbe contenuta in una classeche conteneva metodi per tutti i diversi formati richiesti.

<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> 

Per ulteriori informazioni

+0

In realtà sto facendo questo proprio ora, ma sto cercando di trovare una soluzione * pulita * dal momento che questo mi impone di creare un 'printMethod' per ogni' totalDigits' - 'combinazione fractionDigits'. – Jasper

0

Se è possibile modificare il XSD per utilizzare il tipo di precisionDecimal documentato here si potrebbe essere in grado di utilizzare i minScale e maxScale sfaccettature impostati sullo stesso valore.

+0

In base a [questa risposta] (http://stackoverflow.com/a/4901771/321366), le specifiche JAXB non comprendono la conversione dello schema XML 1.1 in Java.E XJC lancia la seguente eccezione '[ERROR] src-resolve: Impossibile risolvere il nome 'xsd: precisionDecimal' in un (n) componente 'type definition'. Quando lo provo. – Jasper

0

Sono confuso da quello che potrebbe essere ottenuto mantenendo gli zeri finali.

Se gli zeri finali sono così importanti da conservare, utilizzare un valore stringa anziché un numero e utilizzare gli attributi per specificare la larghezza e i decimali.

In ogni caso, gli zeri finali non avranno mai alcun impatto sui calcoli utilizzando uno di questi valori e l'unico modo in cui sarebbe possibile presentarli è la conversione dei risultati in una stringa e il riempimento da soli. Per qualche aiuto facendo questo, si consiglia di vedere ...

CXF client SOAP message formatting

Problemi correlati