2013-11-21 17 views
6

私は私たちのWebサービスに奇妙な問題があります。 私は価格を持っているオブジェクトOrderPositionを持っています(xsd:decimal with fractionDigits = 9)。 Apache CXFは私のためにプロキシクラスを生成し、このフィールドはBigDecimalです。私が10000000.00000より大きい値を送信したいとき、soapメッセージのこのフィールドは科学的表記法(例えば1.1423E + 7)を持っています。BigDecimalはソープメッセージで科学的表記をしています

値が科学技術表記で送信されていないことを強制する方法はありますか。

+0

あなたはどのバインディング(例:jaxbなど)を使用していますか? – Santosh

+0

xmlバインディングにjaxbを使用します。このフィールドには注釈があります。 @XmlElement(name = "NetPrice"、required = true) protected BigDecimal netPrice; –

答えて

3

これはこれを行う方法の1つです。

BigDecimalには、入力番号を文字列として受け取るコンストラクタがあります。これを使用すると、.toString()メソッドが呼び出されたときに入力書式が保存されます。例えば

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

10000000.00000を印刷します。

Jaxb XmlAdaptersで利用できます。 Jaxb XmlAdaptersは便利な方法を提供しますマーシャリング/アンマーシャリングプロセスを制御/カスタマイズBigDecimmalの標準的なアダプタは、次のようになります。

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

これはJaxbコンテキストで登録する必要があります。 Here is the linkが完全な例です。

0

@Santoshありがとうございます! XMLAdapterは私が必要としていたものでした。 さらに、私は私の質問でApache CXFでクライアントクラスを生成すると述べました。この種の問題では、bindings.xjb(mavenのcxf-codegen-pluginに使用するバインディングファイル)に次のコードを追加する必要がありました。

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

これは私のフォーマッタコードです:、生成されたクラスのBigDecimalフィールドで

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); 
    } 
} 

次に、このプラグインは私のためのアダプタを生成

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)); 
    } 
} 

が注釈@XmlJavaTypeAdapter(アダプタ1の.classファイル)を持っています問題を解決しました。

+1

このアプローチを共有していただきありがとうございます。 – Santosh

関連する問題