6

これが私の問題です。生成されたXMLファイルが準拠するXSDが与えられました。org.apache.cxf.cxf-xjc-pluginMavenプラグインと外部バインディングファイルを使用して、ソースコードを生成します。しかし、オブジェクトをマーシャルしようとすると、生成されたXMLが要件を満たしていません。

私の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.5</amount>
...
<rate>10.25</rate>

私はそれが次のようになることを期待していましたが:

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

この問題をクリーンな方法で解決する方法はありますか?

totalDigits私は、すべてのfractionDigits組み合わせに対して複数のアダプターを作成することを望まない。また、XSDは変更される可能性があるため、生成されたソースコードはそのままにしておきます。

4

4 に答える 4

6

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>

詳細については

于 2013-02-13T10:47:58.717 に答える
1

たとえば、特別なXmlAdapterを作成しました

public class BigDecimal8PlaceAdapter extends XmlAdapter<String, BigDecimal> {

@Override
public String marshal(BigDecimal v) throws Exception {
  DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols();
  otherSymbols.setDecimalSeparator('.');
  DecimalFormat df = new DecimalFormat("#0.00000000",otherSymbols);
  return df.format(v);
}

@Override
public BigDecimal unmarshal(String v) throws Exception {
    Double d = Double.valueOf(v);
    return BigDecimal.valueOf(d);
}

}

次に、プロパティにXmlAdapterを追加します。

@XmlElement(name = "rate", required = true)
@XmlJavaTypeAdapter(BigDecimal8PlaceAdapter.class)
protected BigDecimal rate;

次に、小数点以下2桁のアダペッターで同じことを行います。

于 2019-01-28T11:45:26.967 に答える
0

ここprecisionDecimalに記載されているタイプを使用するようにXSDを変更できる場合は、同じ値に設定されたファセットとファセットを使用できる可能性があります。minScalemaxScale

于 2013-02-13T08:20:57.813 に答える
0

末尾のゼロを維持することで何が得られるかについて、私は混乱しています。

末尾のゼロを保持することが非常に重要な場合は、数値の代わりに文字列値を使用し、属性を使用してその幅と小数を指定します。

いずれの場合も、末尾のゼロがこれらの値を使用した計算に影響を与えることはありません。これらの値を表示できる唯一の方法は、結果を文字列に変換して自分でパディングすることです。それを行うためのいくつかの助けのために、あなたは見たいかもしれません...

CXFクライアントのSOAPメッセージのフォーマット

于 2014-01-22T22:00:58.557 に答える