2013-11-21 22 views
6

Ho uno strano problema con il nostro servizio web. Ho un oggetto OrderPosition che ha un prezzo (che è xsd: decimal con fractionDigits = 9). Apache CXF genera per me le classi proxy e questo campo è BigDecimal. Quando desidero inviare un valore superiore a 10000000,00000, questo campo nel messaggio soap ha una notazione scientifica (ad esempio 1.1423E + 7).BigDecimal ha notazione scientifica nel messaggio soap

Come imporre che il valore non sia stato inviato nella notazione scientifica.

+0

Quale legame (ad es. Jaxb ecc.) State usando? – Santosh

+0

Uso jaxb per il collegamento xml. E questo campo ha annotazioni: @XmlElement (name = "NetPrice", required = true) protetto BigDecimal netPrice; –

risposta

3

Ecco un modo in cui ciò può essere fatto.

BigDecimal ha un costruttore che prende il numero di input come una stringa. Questo quando usato, conserva la formattazione di input quando viene chiamato il suo metodo .toString(). per esempio.

BigDecimal bd = new BigDecimal("10000000.00000"); 
System.out.println(bd); 

stamperà 10000000.00000.

Questo può essere sfruttato in Jaxb XmlAdapters. Jaxb XmlAdapters offre un modo conveniente per controllare /personalizzare il processo di marshalling/smascheramento. Un adattatore tipico per BigDecimmal sarà simile al seguente.

public class BigDecimalXmlAdapter extends XmlAdapter{ 

    @Override 
    public String marshal(BigDecimal bigDecimal) throws Exception { 
     if (bigDecimal != null){ 
      return bigDecimal.toString(); 
     } 
     else { 
      return null; 
     } 
    } 

    @Override 
    public BigDecimal unmarshal(String s) throws Exception { 
     try { 
      return new BigDecimal(s); 
     } catch (NumberFormatException e) { 
      return null; 
     } 
    } 
} 

Questo deve essere registrato con il contesto JAXB. Here is the link con l'esempio completo.

0

@Santosh Grazie! XMLAdapter era quello di cui avevo bisogno. Inoltre, come ho detto nella mia domanda, ho generato classi client con Apache CXF. In questo tipo di problema ho dovuto aggiungere il seguente codice a bindings.xjb (file di binding che è usato per cxf-codegen-plugin in Maven).

<jaxb:javaType name="java.math.BigDecimal" xmlType="xs:decimal" 
    parseMethod="sample.BigDecimalFormater.parseBigDecimal" 
    printMethod="sample.BigDecimalFormater.printBigDecimal" /> 

Questo è il mio in codice:

public class BigDecimalFormater { 
    public static String printBigDecimal(BigDecimal value) { 
     value.setScale(5); 

     return value.toPlainString(); 
    } 

    public static BigDecimal parseBigDecimal(String value) { 
     return new BigDecimal(value); 
    } 
} 

Poi questo plugin generare Adattatore per me

public class Adapter1 extends XmlAdapter<String, BigDecimal> { 
    public BigDecimal unmarshal(String value) { 
     return (sample.BigDecimalFormater.parseBigDecimal(value)); 
    } 
    public String marshal(BigDecimal value) { 
     return (sample.BigDecimalFormater.printBigDecimal(value)); 
    } 
} 

Nel campo BigDecimal classe generata ha ottenuto l'annotazione @XmlJavaTypeAdapter (adapter1 .class), e ha risolto il problema.

+1

grazie per aver condiviso questo approccio. – Santosh

Problemi correlati