Попытка запустить `Double` в` <Значение xsi: type = "xsd: double"> 12.34 `с JaxbJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Попытка запустить `Double` в` <Значение xsi: type = "xsd: double"> 12.34 `с Jaxb

Сообщение Anonymous »

Во -первых, я довольно новичок в Java, поэтому большая часть того, что я пытаюсь сделать, вероятно, ошибается, и я не понимаю, с чем я имею дело. Я пытался решить эту проблему примерно в 3 или 4 рабочих днях (распространяется за последние две недели) и разработал довольно разочарование для JAXB. Сама Java и большинство других проектов кажутся более или менее хорошими, но Jaxb особенно, кажется, существует исключительно, чтобы помешать мне выполнить работу. Это был грязный путь к моей нынешней ситуации для этой проблемы (у меня также были проблемы с другими вещами, такими как Wsimport , которые я мог решить), но я пытаюсь описать свои попытки решить эту частичную проблему более или менее простым способом.

Код: Выделить всё

org.springframework.boot:spring-boot-starter-web-services
com.sun.xml.ws:jaxws-rt:4.0.2
com.sun.xml.bind:jaxb-xjc:4.0.5
com.sun.xml.bind:jaxb-impl:4.0.5
org.jvnet.jaxb:jaxb-tools-project:4.0.11
wsdl4j:wsdl4j
< /code>
У нас есть проект, который подключается к мыльной службе нескольких внешних конечных точек и загрузки информации из этих конечных точек. Это программное обеспечение, кажется, работает, но я хочу написать тестирование интеграции, используя самозаписную проверку тестируемого и внедрения для этого проекта. < /P>
(это означает, что я не хочу изменять фактический продуктивный клиент /Unmarshaller в этом клиенте.) < /P>
У меня есть файл wsdl (wsdl-файл (a *.asmx < /code, что является PRACISE), который будет при условии, что при условии, что при условии, что можно было при условии wsdl (a *. (не веб-сервис-провайдеры сами, но на несколько уровней «над ними»). Я хочу написать свой тестовый сервер и мыло-папсервис, используя Spring-Webservices, используя этот WSDL. I have created Java Classes from that WSDL (the extracted XSD Schema) using wsimport
and defined my Spring @Endpoint, which I have confirmed is working.
The XSD Schema of the WSDL file contains a Value element without any type in one of it's complex-types, like this:

Код: Выделить всё

  ...

...
Это значение тег может иметь много разных форм, большинство из которых не указаны внутри схемы WSDL (я даже не уверен, что они могут быть указаны с помощью XSD/WSDL, но, возможно, мне нужно попробовать, если все остальное не удалось). Я не могу действительно легко изменить файл WSDL, так как мы будем получать новые версии этого файла в будущем от указанной внешней стороны. Изменение сгенерированных классов вручную-это также то, чего я хотел бы избежать, хотя я делал это при поиске решения этой проблемы, используя исправления в процессе сборки. В моей текущей ситуации у меня есть патч -файл, применяемый во время сборки, который меняет сгенерированный @xmlelement (name = "value") в @xmlanyelement (lax = true) для этого сгенерированного свойства (которое имеет объект типа в генерируемой Java, для того, чтобы иметь java taga, чтобы иметь значение, чтобы иметь значение для значений, чтобы иметь значение для значений, чтобы иметь значение для значений, чтобы иметь значение для значения, чтобы иметь значение, которое имеет значение для значения, чтобы иметь значение для значений. Double объект быть внедренным в кусок XML из заголовка: 12.34 , с псевдонимом пространства имен, правильно соответствующим псевдонимам именам, которые JaxB будет генерировать позже, когда Marshalling отвечает мылу. Мне нужно, чтобы это было намного более гибким в будущем, чтобы поддержать все виды типов данных и структур, но в качестве первого шага двойного было бы достаточно (это было бы, по крайней мере, некоторое прогресс).
то, что я пробовал до сих пор:
1. /> Моей первой попыткой было определить внешний файл привязки, чтобы сказать Jaxb карту Double < /code> в нужный кусок XML, при этом сохраняя полиморфную природу этого тега, используя что -то вроде этого: < /p> со статическими методами отображения, такими как parsemethod и printmethod . К сожалению, это не работает: < /p>

Код: Выделить всё

parsing a schema...
[ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings.
line 22 of file:/home/user/git/foo/bar/src/main/resources/wsdl/binding.xjb

[ERROR] (the above customization is attached to the following location in the schema)
line 195 of file:/home/user/git/foo/bar/test-server/src/main/resources/wsdl/Schema.xsd

Failed to parse a schema.
< /code>
Я не совсем уверен, почему это связывание Javatype кажется не в том месте, но моя рабочая теория заключаетсяsimpleType< /code> /complextype < /code>) и не для тегов без типа.
Пример, который я видел в Интернете, применил этот джаватип связывается с тегом SimpleType < /code> в схеме,
, что я не могу сделать здесь, потому что у этого тега нет типа. jakarta.xml.bind.annotation.adapters.xmladapter.xmladapter  
), но получил одинаковую ошибку:

Код: Выделить всё

...
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
...

...
и я также попробовал его без тегов и и множество других вариантов, без изменения сообщения об ошибке. Как это: < /p>

Код: Выделить всё

JAXBElement element = new JAXBElement(new QName(NAMESPACE, "Value"), Double.class, inputDouble);
element.setValue(inputDouble.toString());
return element;
... в то время как Appling marshaller.setSupportJaxBelementClass (true) к маршаллеру.
Это, кажется, несколько работает, но терпит неудачу, потому что:
  • a). Tag и
  • b) Unmarshaller в клиенте разрешил это в экземпляр com.sun.org.apache.xerces.internal.dom.elementnsimpl (с типом = null ), вместо двойного объекта непосредственно. При использовании клиента с «реальной» внешней службой, двойной производится непосредственно в этом месте (от JAXB, может быть, из -за этого недостающего типа информации?).
Также, кажется, не способен настройку xsi: type = "xsd: Double" , что я думаю, что я думаю, что я думаю, что я думаю, что я думаю, что я думаю, что я думаю. Работа.

Код: Выделить всё

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()
Element element = doc.createElementNS(NAMESPACE, "Value");
element.setAttributeNS(XSI_NS, "type", "xsd:double");
element.setTextContent(input.toString());
return element;
Это имеет очевидный недостаток того, что префикс xsd: жестко кодируется, что сломается, как только Jasx решит использовать другой префикс для этого пространства имен. Но если бы это сработало, у меня было бы, по крайней мере, какое-то рабочее решение . Значение для setattributens и попросить JASX выяснить правильный псевдоним пространства имен, но, к сожалению, DOM-API не поддерживает это.)

Подробнее здесь: https://stackoverflow.com/questions/797 ... 2-34-value
Ответить

Быстрый ответ

12.34 `с Jaxb" class="inputbox autowidth" />
12.34 `с Jaxb" />
Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»