Попытка запустить `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, так как мы будем получать новые версии этого файла в будущем от указанной внешней стороны. Изменение сгенерированных классов вручную-это также то, чего я хотел бы избежать, хотя я делал это при поиске решения этой проблемы, используя исправления в процессе сборки. In my current situation, I have a patchfile applied during the build that changes the generated @XmlElement(name = "Value") into @XmlAnyElement(lax = true) for that generated property (which is of type Object in the generated Java, by the way).
My current "milestone" target for that Value tag is to have a Java 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 решит использовать другой префикс для этого пространства имен. Но если бы это сработало, у меня было бы, по крайней мере, какое-то рабочее решение . Значение для CreateElementns и попросить 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»