Форматирование сообщений 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.