11

私が書いた WebService で Spring 3 IOC と JAXB/JAX-WS を使用しています。値の完全な精度を処理できないため、消費者に返す前に丸めなければならないデータで、現在わずかな問題が発生しています。

WS の設計と計算への影響を最小限に抑えるために、Jaxb XmlAdapter を使用して、応答のマーシャリング時に値を丸めることにしました。すべて正常に動作します。

私の今の問題は、それを柔軟にしたいということです。つまり、場合によっては、小数点以下 2 桁、4 桁などに丸める必要があります。現在、TwoDecimalAdapter と FourDecimalAdapter を作成し、モデル定義で必要に応じて適切なものを使用する必要があります。これは、コードの重複を意味します。

一般的な Rounding Adapter を作成し、それにパラメーターを渡す方法はありますか? たとえば、次の代わりに:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=FourDecimalRoundingAdapter.class,type=java.math.BigDecimal.class)

次のようなことができるようになりたいです。

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=new RoundingAdapter(4),type=java.math.BigDecimal.class)

明らかに、JAXB はアダプター自体をインスタンス化するため、これは機能しませんが、パラメーターをアダプターに渡すために使用できる手法はありますか? Spring で丸めアダプターを宣言してそのように使用できるようにしたいのですが、再利用可能なソリューションを考案することはできません。

ありがとう、

エリック

4

2 に答える 2

2

これを Spring にどのように組み込むかはわかりませんが、活用できる JAXB メカニズムの説明を以下に示します。

次のものがある場合:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=RoundingAdapter.class,type=java.math.BigDecimal.class)

次に、スタンドアロンの JAXB API を使用して、次のことができます。以下のコードは、 が検出されるたびRoundingAdapterに、指定されたインスタンスを使用する必要があることを意味します。

marshaller.setAdapter(new RoundingAdapter(4));
unmarshaller.setAdapter(new RoundingAdapter(4));

詳細については

于 2012-07-12T15:22:07.947 に答える