Форматирование сообщений SOAP клиента CXF

В файле WSDL, который я использовал для создания клиента CXF, определено это определение элемента:

<xsd:element name="Rate"> 
  <xsd:simpleType>
    <xsd:restriction base="xsd:decimal">
      <xsd:totalDigits value="18" />
      <xsd:fractionDigits value="2" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

Однако, когда я пытаюсь отправить сообщение SOAP, количество цифр после десятичной точки превышает максимальное значение. Например, я получаю 2.48862, ожидая 2.48. Чтобы решить эту проблему, я планировал реализовать XmlAdapter для маршаллинга значений, однако я не могу сопоставить элемент в WSDL с клиентом, потому что класс onyl XmlAdapter передается в объявление поля в виде аннотации.

@XmlJavaTypeAdapter(CustomXmlAdapter.class)

Кажется, нет способа сообщить XmlAdapter, что поле должно иметь 2 цифры после десятичной точки.

Число цифр дроби изменяется от элемента к элементу. У меня также нет доступа к изменению WSDL.

Есть ли способ форматировать эти элементы при наблюдении числа десятичных точек, указанных в WSDL?

Ответ 1

Я мог бы предложить использовать xQuery в схеме, на которую ссылается WSDL. Имя и расположение схемы являются частью WSDL и могут быть также получены через XQuery.

Схемы - это хорошо сформированный XML, поэтому вам нужно будет определить правильный селектор XPath для извлечения желаемого значения - в этом случае это будет как минимум...

//xsd:element[@name == 'Rate']//xsd:fractionDigits/@value

Что должно давать значение 2.

Имейте в виду, что есть интерпретатор XPath/XQuery, встроенный в последние JDK. Вам просто нужно наложить на него какой-то интерфейс, и я считаю, что он будет прекрасно обрабатывать потоки.

Выполнение вышеизложенного позволит вам динамически запрашивать схему при обработке данного элемента, позволяя, например, получить правильное число десятичных цифр при обработке Rate.