Создайте классы запросов и ответов с привязками JAXB

Открытая тема с навигацией

ZIP-файл, содержащий проект Java-кода для этого примера: JAXBBindingExample.zip

Темы, содержащие примеры кода для этого проекта: JAXBBindingExample.java а также MessageAdjustments.java

Фон

В Создание соединений с URLConnection , пример создал соединение, отправил сообщение и получил ответ. Но пример жестко закодировал запрос и только напечатал ответ SOAP в выходной буфер. Чтобы создавать сообщения SOAP и работать с ответами, мы можем создать привязки к описанию службы, документу WSDL, для конечной точки. WSDL Документы (язык описания веб-служб) представляют собой XML, и несколько методов легко доступны для привязки XML к объекту. JAXB Java Architecture for XML Binding - это признанная технология для связывания. Другие способы связывания классов Java с XML включают АБР Привязка данных оси 2 и XML Beans , Это проекты Apache и поэтому не являются основной частью. На данный момент мы продолжаем с основными технологиями.

Кроме того, поддерживает то, что называется JAX-WS 2.0 , который находится над JAXB в стеке API веб-служб для. Хотя это может быть полезно, мы пока сосредоточимся на привязках JAXB.

В этом примере мы будем работать с IDE NetBeans, но аналогичные мастера доступны в других IDE, и, конечно, вам вообще не нужно использовать IDE, если это ваш предпочтительный стиль разработки. Мы уже рассмотрели, как создать соединение, и заложили основу для отделения логики для строки сообщения SOAP от логики, чтобы создать соединение и выполнить запрос в Приспособьте HTTPS Соединения ,

Начать

Мы потянем класс HttpURLConnectionTechnique в этом примере.

Мы потянем класс HttpURLConnectionTechnique в этом примере

Здесь показан проект для приложения, которое содержит класс с методом main и копию класса, созданного в Приспособьте HTTPS Соединения ,

переплет

Мы хотим добавить привязку к WSDL для конечной точки веб-службы. Чтобы получить WSDL или URL для WSDL, мы можем использовать сгенерированную ссылку на конечную точку. Мы будем продолжать использовать конечную точку BizOps, чтобы избежать осложнений. Однако на этом этапе обратите внимание, что, поскольку мы создаем привязки к конечным точкам, мы должны создать привязку для каждой конечной точки, которую мы используем. Существует множество конечных точек BizOps, но доступна только одна конечная точка AppFxWebService. Так что это недостаток BizOps.

Так что это недостаток BizOps

Например, в сгенерированной ссылке для локальной установки конечной точки веб-службы приложения, расположенной по адресу:

HTTP: // локальный / bbAppFx / VPP / bizops / DB [BBINFINITY] /codetables/ADDRESSTYPECODE/soap.asmx

Ссылка с текстом «Описание службы» ведет к WSDL.

Ссылка с текстом «Описание службы» ведет к WSDL

Для конечной точки BizOps приложения WSDL можно просматривать по тому же URL-адресу, что и конечная точка с квалификацией? WSDL. Давайте использовать мастер NetBeans для создания привязки к этому WSDL.

Щелкните правой кнопкой мыши узел проекта в Projects и выберите «New»> «JAXB Binding». Возможно, вам придется перейти к другому ... Кроме того, вам может потребоваться настроить NetBeans для обработки этого.

Появится новый экран привязки JAXB.

Введите Имя привязки и Имя пакета. Используйте то же имя сейчас.

Предупреждение: не используйте имя пакета по умолчанию. То же имя по умолчанию будет одинаковым для конечных точек BizOps.

Давайте использовать AddressTypeCodeService. Теперь в разделе «Файл схемы» выберите «Выбрать из URL» и введите строку URL для WSDL. Не забудьте использовать процентное кодирование для квадратных скобок.

Совет. При вырезании и вставке URL-адреса конечной точки для Business Operations Services обязательно измените квадратные скобки вокруг имени базы данных на% 5B и% 5D соответственно. Это называется процентов кодирования ,

В NetBeans при вводе URL-адреса WSDL может появиться следующее сообщение:

Тип схемы "WSDL" является "экспериментальным и не поддерживается" JAXB RI.

Тип схемы WSDL является экспериментальным и не поддерживается JAXB RI

Но процесс работает. Другая документация не дает никаких указаний на это.

Другая документация   не дает никаких указаний на это

Нажмите Готово. Мастер создает привязку и генерирует источники.

Мастер создает привязку и генерирует источники

Скопируйте Связывание и Изучите Классы

Обратите внимание, что сгенерированный код организован под указанным нами именем пакета, но в папке с именем Generated Sources (jaxb). Давайте сделаем копию и добавим ее в нашу папку Source Packages. Мы сделаем некоторые незначительные изменения, и мы не хотим перезаписывать их, когда исходные тексты JAXB Bindings будут восстановлены. Щелкните правой кнопкой мыши пакет AddressTypeCodeService и скопируйте его в папку «Исходные пакеты».

Затем измените информацию о привязке, чтобы имя пакета для сгенерированного кода не совпадало. Щелкните правой кнопкой мыши узел привязки и выберите «Изменить параметры JAXB».

Появится экран параметров изменения JAXB. Похоже на новый экран, который вы видели при создании привязки. Измените имя пакета в имени пакета на «AddressTypeCodeServiceGenerated». Привязки будут восстановлены, но ваш скопированный пакет останется прежним. Теперь давайте посмотрим на скопированный пакет AddressTypeCodeService. Раскройте это.

Вы можете увидеть соответствие между WSDL и сгенерированными классами. Давайте откроем один. Дважды щелкните файл класса GetTableEntryListRequest.java. Обратите внимание, что он расширяет более общий класс BizOpsRequest. Комментирование дает вам представление о разметке в исходном WSDL. Есть некоторые аннотации, которые использует JAXB. Наконец, есть класс с некоторыми основными методами. Следите за этими аннотациями. Мы вернемся к этим.

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "GetTableEntryListRequest", propOrder = {"includeInactive", "refreshCache"})

Еще один момент, на который стоит обратить внимание, - это класс ObjectFactory.java. Мы будем использовать это для создания экземпляров объектов.

Что дает нам связывание?

Но что у нас сейчас? У нас есть артефакты, которые можно преобразовать в XML. Кроме того, XML, который соответствует объектам на основе этих классов, может быть преобразован в объекты. Таким образом, вы можете работать с бизнес-информацией в объекте Java, представлять ее и так далее. Затем вы можете преобразовать его в XML (SOAP) и отправить его в веб-службу. Вы также можете получить XML (SOAP) от веб-службы, преобразовать сообщение в объекты Java и работать с ним. Мы еще не дошли до конца. Итак, продолжим.

На этом этапе эти классы должны быть доступны через автозаполнение в редакторе IDE. Попробуйте это. Начните вводить это в метод main класса JAXBBindingExample:

AddressTypeCodeService.

Автозаполнение должно сработать.

Автозаполнение должно сработать

Но будьте внимательны - создайте объект сообщения запроса

Заманчиво просто начать кодировать. Но здесь есть несколько соображений. Одна из них заключается в том, что нам нужно правильно создавать экземпляры объектов, чтобы они работали так, как намеревается JAXB. Итак, предположим, что мы хотим создать сообщение запроса с этими классами. Вот как мы это делаем.

AddressTypeCodeService.GetTableEntryListRequest listRequestObj = new AddressTypeCodeService.GetTableEntryListRequest (); AddressTypeCodeService.ObjectFactory objectFactoryAddTyCoSvc = new AddressTypeCodeService.ObjectFactory (); listRequestObj = objectFactoryAddTyCoSvc.createGetTableEntryListRequest ();

Сначала создайте экземпляр AddressTypeCodeService.GetTableEntryListRequest. Затем создайте фабрику объектов. Затем назначьте объект, созданный с помощью фабрики объектов, экземпляру AddressTypeCodeService.GetTableEntryListRequest. Вы можете создать фабрику объектов один раз в начале блока кода и использовать ее повторно, если будете вызывать методы из нее более одного раза.

Дело в том, чтобы не просто создать экземпляр AddressTypeCodeService.GetTableEntryListRequest. Используйте объект фабрики. Следуйте приведенной выше схеме при создании экземпляров этих объектов. Обратитесь к этому объяснению для получения дополнительных указаний: Архитектура Java для привязки XML (JAXB) ,

Предупреждение: в этот момент у вас может возникнуть соблазн импортировать AddressTypeCodeService в класс. Сложность заключается в том, что другие конечные точки BizOps будут использовать много одинаковых имен для классов и методов. Поэтому, если вы не планируете использовать только одну конечную точку в данном классе, не импортируйте. Хотя это более многословно, полностью квалифицируйте элементы из этих сгенерированных классов.

Теперь, когда у нас есть объект для запроса BizOps, который запрашивает списки записей в таблице кодов типа адреса, мы можем работать с самим объектом. Помните, что мы назвали объект listRequestObj. Создайте новую строку и посмотрите, что вы получите с этим объектом.

Создайте новую строку и посмотрите, что вы получите с этим объектом

Большинство из этих классов содержат методы Get и Set, которые позволяют вам манипулировать этими данными внутри объекта. Мы просто запрашиваем список. Так что мы не будем здесь много манипулировать. Но позже вы будете часто использовать Gets и Sets.

JAXBContext и Marshaller

Для сообщения программе потребуется нечто, называемое JAXBContext. Добавьте эту строку:

JAXBContext contextForRequest = JAXBContext.newInstance (AddressTypeCodeService.GetTableEntryListRequest.class);

Для поддержки этой строки вам необходимо импортировать javax.xml.bind.JAXBContext.

Описание класса: JAXBContext

Вам также нужно обработать JAXBException. Так что добавьте этот импорт:

import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException;

И добавьте это предложение throws к основному методу: JAXBException. IDE должна помочь вам в этом.

Теперь объявите Marshaller и установите его свойства, чтобы использовать форматированный вывод JAXB:

Marshaller m = contextForRequest.createMarshaller (); m.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);

Описание интерфейса: ИАС

Вам нужен еще один импорт:

import javax.xml.bind.Marshaller;

Теперь добавьте код для маршалинга объекта в XML. поместите XML в строку.

Примечание. Вы можете обрабатывать XML другими способами, например записывать в файл или напрямую в соединение. Но мы сделаем некоторую корректировку, поэтому здесь полезно поместить ее в строку.

StringWriter st = new StringWriter (); m.marshal (listRequestObj, st); String listRequestStr = st.toString ();

Импорт для StringWriter:

import java.io.StringWriter;

Описание класса: StringWriter

Почему мы сделали копии

Просто чтобы увидеть, как далеко мы продвинулись, добавьте строку для вывода того, что находится в строке, и запустите программу:

System.out.println (listRequestStr);

Вы получаете исключение:

Исключение в потоке "main" javax.xml.bind.MarshalException - со связанным исключением: [com.sun.istack.internal.SAXException2: невозможно маршалировать тип "AddressTypeCodeService.GetTableEntryListRequest" как элемент, так как отсутствует аннотация @XmlRootElement]

Помните, как мы делали копии сгенерированных классов? Вот почему. Откройте файл для GetTableEntryListRequest в пакете, который вы скопировали. Добавьте эту аннотацию:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "GetTableEntryListRequest", propOrder = {"includeInactive", "refreshCache"}) @XmlRootElement (name = "GetTableEntryListRequest")

Также добавьте импорт этой аннотации в файл класса для GetTableEntryListRequest:

import javax.xml.bind.annotation.XmlRootElement;

XmlRootElement;

Сохраните все и запустите снова. Вы должны получить это в окне вывода:

run: &lt;? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?> <GetTableEntryListRequest xmlns = "blackbaud_appfx_server_bizops"> <IncludeInactive> false </ IncludeInactive> <RefreshCache> false </ RefreshCache> </ RefreshCache> </ GetTableEntryListRequest> BUILD SUCCESSFUL (общее время: 0 секунд)

Обернуть фрагмент сообщения

Так что теперь мы близки к действительному сообщению запроса, но чего-то не хватает. Мы используем технику связывания, которая не переносит сообщение для нас. Фактически нам пришлось добавить корневую аннотацию, чтобы получить сообщение маршалу. Поэтому нам нужно добавить в сообщение специфичный для SOAP XML. Мы будем использовать SOAP 1.2 для всего, поэтому создадим метод, который добавляет эту обертку для нас.

Создайте файл класса с именем MessageAdjustments.java. К этому классу добавьте этот метод:

public static String fixSOAPRequestMessage (String messageFragment) выдает IOException {String lvMessageFragment = messageFragment.substring (56); Строка top = "&lt;? Xml version = \" 1.0 \ "encoding = \" utf-8 \ "?> \ N" + "<soap12: Конверт xmlns: xsi = \" http://www.w3.org/ 2001 / XMLSchema-instance \ "xmlns: xsd = \" http: //www.w3.org/2001/XMLSchema \ "xmlns: soap12 = \" http://www.w3.org/2003/05/soap- конверт \ "> \ n" + "<soap12: Body> \ n"; Строка bottom = "</ soap12: Body> \ n" + "</ soap12: Envelope>"; String wholeMessage = top + lvMessageFragment + bottom; вернуть целое сообщение; }

Этот метод захватывает фрагмент сообщения без его корневого элемента (&lt;? Xml ...) и помещает его в элементы SOAP Body и Envelope. он также добавляет декларацию XML в начало документа XML.

В методе main после маршалинга примените этот метод к listRequestString:

listRequestStr = MessageAdjustments.fixSOAPRequestMessage (listRequestStr);

Теперь, когда вы запускаете программу, ваше окно вывода должно выглядеть так:

run: &lt;? xml version = "1.0" encoding = "utf-8"?> <soap12: Envelope xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http : //www.w3.org/2001/XMLSchema "xmlns: soap12 =" http://www.w3.org/2003/05/soap-envelope "> <soap12: Body> <GetTableEntryListRequest xmlns =" ​​blackbaud_appfx_server_bizops "> <IncludeInactive> false </ IncludeInactive> <RefreshCache> false </ RefreshCache> </ GetTableEntryListRequest> </ soap12: Body> </ soap12: Envelope> BUILD SUCCESSFUL (общее время: 0 секунд)

Фактически отправьте запрос и получите ответ

Теперь у нас есть действительное сообщение SOAP, которое мы можем отправить с помощью нашего метода HttpURLConnectionTechnique.createHttpURLConnectionAndMakeRequest. Метод, который мы создали, требует String для сообщения SOAP и String для URL.

String urlString = "http: //localhost/bbAppFx/vpp/bizops/db%5BBBINFINITY%5D/codetables/ADDRESSTYPECODE/soap.asmx"; String listReplyStr = HttpURLConnectionTechnique.createHttpURLConnectionAndMakeRequest (listRequestStr, urlString);

С помощью этой строки программа отправит HTTP-запрос, содержащий сообщение SOAP-запроса, которое мы определили с объектами. Программа назначает ответное сообщение, которое возвращается в строку.

Добавьте еще одну строку вывода и запустите программу:

System.out.println (listRequestStr); System.out.println ("\ nОтветное сообщение: \ n"); System.out.println (listReplyStr);

Окно вывода должно выглядеть так:

run: &lt;? xml version = "1.0" encoding = "utf-8"?> <soap12: Envelope xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http : //www.w3.org/2001/XMLSchema "xmlns: soap12 =" http://www.w3.org/2003/05/soap-envelope "> <soap12: Body> <GetTableEntryListRequest xmlns =" ​​blackbaud_appfx_server_bizops "> <IncludeInactive> false </ IncludeInactive> <RefreshCache> false </ RefreshCache> </ GetTableEntryListRequest> </ soap12: Body> </ soap12: Envelope> Ответное сообщение: &lt;? Xml version = "1.0" encoding = "utf-8" ?> <soap: Envelope xmlns: soap = "http://www.w3.org/2003/05/soap-envelope" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd = "http://www.w3.org/2001/XMLSchema"> <soap: Body> <GetTableEntryListReply xmlns = "blackbaud_appfx_server_bizops"> <StatusOK> true </ StatusOK> <StatusCode> 200 </ StatusCode> < StatusMessage> ОК </ StatusMessage> <Ряды> <TableEntryListRow> <ID> 144f6283-b479-48fb-97fe-9444abb6d8a5 </ ID> <Описание> Расчеты </ Описание> <Последовательность> 1 </ Последовательность> </ TableEntryListRow> < TableEntryListRow> <ID> 2e05bc62-2d51-47 a5-b7a0-8ac0d4243caf </ ID> <Описание> Бизнес </ Description> <Sequence> 2 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 578306f0-9b37-47d4-8185-05380b66cbc8 </ ID> <Описание > История занятости </ Description> <Sequence> 3 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 46f09a15-665f-4517-b0d9-e5dee3db63ad </ ID> <Описание> Бывший адрес </ Description> <Sequence> 4 </ Последовательность> </ TableEntryListRow> <TableEntryListRow> <ID> e4906793-821f-49b9-b9b7-9bfefa6c6165 </ ID> <Описание> Главная </ Описание> <Последовательность> 5 </ Последовательность> </ TableEntryListRow> <TableEntryListRow > <ID> b8b8d7a0-852c-4760-A25F-8eaeab6aba43 </ ID> <Описание> Недопустимый </ Описание> <Последовательность> 6 </ Последовательность> </ TableEntryListRow> <TableEntryListRow> <ID> 3e495340-f4b7-488b-8669 -53e742ebe30d </ ID> <Описание> Отношения </ Description> <Sequence> 7 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 8100ea3d-a5ea-48ef-bd01-f655464b5f1b </ ID> <Описание> </ Описание> <Последовательность> 8 </ Последовательность> </ TableEntryListRow> <TableEntryListRow> <ID> c0150cc 4-b2ee-43d5-87fb-cfbd4738268a </ ID> <Описание> Отступление </ Описание> <Последовательность> 9 </ Последовательность> </ TableEntryListRow> <TableEntryListRow> <ID> 3fa6b4ca-7031-4ffd-9c84-5931c3d42abd </ ID> <Описание> Школьная резиденция </ Описание> <Sequence> 10 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> de66c7fa-a24a-46b4-b4c0-9f863f4a1ac1 </ ID> <Описание> Доставка </ Description> <Sequence> 11 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 22dd9406-5f74-472c-bb80-3c1e8ec527bc </ ID> <Описание> Супруга </ Description> <Sequence> 12 </ Sequence> </ Sequence> TableEntryListRow> <TableEntryListRow> <ID> 0701a2fc-9d35-4c55-96c8-5f18f7fa1b8c </ ID> <Описание> Летний дом </ Description> <Sequence> 13 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <06>> ID d9f8-4590-92bf-f2e674c0cd30 </ ID> <Описание> Временная доля </ Описание> <Sequence> 14 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 2d8e0e37-e93c-4e67-9080-55843 /597f18 > <Описание> Дом для отпуска </ Описание> <Sequence> 15 </ Sequence> </ TableEntryListRow> <TableEntryLi stRow> <ID> 8f76cb82-9f01-45c0-bf09-1041d00ae052 </ ID> <Описание> Зимний дом </ Description> <Sequence> 16 </ Sequence> </ TableEntryListRow> </ Rows> <UserDefinedSort> true </ UserDefinedSort > </ GetTableEntryListReply> </ soap: Body> </ soap: Envelope> BUILD SUCCESSFUL (общее время: 1 секунда)

Ответное сообщение не имеет разрывов строк. Но если вы переформатируете его с помощью редактора XML в Visual Studio, в зависимости от записей таблицы кодов в вашей базе данных, это будет выглядеть так (сокращенно):

&lt;? xml version = "1.0" encoding = "utf-8"?> <soap: Envelope xmlns: soap = "http://www.w3.org/2003/05/soap-envelope" xmlns: xsi = "http : //www.w3.org/2001/XMLSchema-instance "xmlns: xsd =" http://www.w3.org/2001/XMLSchema "> <soap: Body> <GetTableEntryListReply xmlns =" ​​blackbaud_appfx_server_bizops "> <StatusOK > true </ StatusOK> <StatusCode> 200 </ StatusCode> <StatusMessage> OK </ StatusMessage> <Rows> <TableEntryListRow> <ID> 144f6283-b479-48fb-97fe-9444abb6d8a5 </ ID> <Описание> Биллинг </ ID> Описание> <Sequence> 1 </ Sequence> </ TableEntryListRow> <TableEntryListRow> <ID> 2e05bc62-2d51-47a5-b7a0-8ac0d4243caf </ ID> <Описание> Бизнес </ Description> <Sequence> 2 </ Sequence> < / TableEntryListRow> ... <TableEntryListRow> <ID> 8f76cb82-9f01-45c0-bf09-1041d00ae052 </ ID> <Описание> Зимний дом </ Description> <Sequence> 16 </ Sequence> </ TableEntryListRow> </ Rows> <UserDefinedSort> true </ UserDefinedSort> </ GetTableEntryListReply> </ soap: Body> </ soap: Envelope>

Unmarshal - Поместите ответ в объект

Мы до сих пор не сделали полный кругосветное путешествие к объектам. Нам нужно разархивировать XML в объект. Как и в случае с маршалингом, мы должны внести коррективы для элементов, специфичных для SOAP. Добавьте это в файл класса MessageAdjustments.java:

public static String stripSOAPReplyMessage (String messageFragment) выдает IOException {String strippedMessage = messageFragment; String badString = "xsi: nil = \" true \ ""; strippedMessage = strippedMessage.replaceAll (badString, ""); strippedMessage = strippedMessage.substring (216, strippedMessage.length () - 28); вернуть раздетое сообщение; }

Это удаляет заголовок XML и элементы конверта SOAP и тела из сообщения. Примените это к listReplyStr:

listReplyStr = MessageAdjustments.stripSOAPReplyMessage (listReplyStr);

Нам нужно создать экземпляр объекта ответа так же, как мы создали объект запроса. Но мы можем повторно использовать объектную фабрику.

AddressTypeCodeService.GetTableEntryListReply listReplyObj = new AddressTypeCodeService.GetTableEntryListReply (); listReplyObj = objectFactoryAddTyCoSvc.createGetTableEntryListReply ();

Затем нам нужна программа для создания JAXBContext и Unmarshaller.

JAXBContext contextForReply = JAXBContext.newInstance (AddressTypeCodeService.GetTableEntryListReply.class); Unmarshaller u = contextForReply.createUnmarshaller ();

Описание интерфейса: Unmarshaller

Чтобы разобрать, программа использует StringBuilder и StreamSource:

StringBuilder xmlStr = new StringBuilder (listReplyStr); listReplyObj = (AddressTypeCodeService.GetTableEntryListReply) u.unmarshal (new StreamSource (new StringReader (xmlStr.toString ())));

Описание класса: StringBuilder

Описание класса: StreamSource

Все эти импорты должны появиться в классе:

импорт java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; импорт javax.xml.bind.Unmarshaller; import javax.xml.transform.stream.StreamSource;

(Маленький) Вкус Как Использовать Объекты

Давайте также добавим строку для отправки информации из объекта ответа в окно вывода:

System.out.println (listRequestStr); System.out.println ("\ nОтветное сообщение: \ n"); System.out.println (listReplyStr); System.out.println ("\ nЗначение объекта ответного сообщения: \ n"); System.out.println (listReplyObj.getRows (). GetTableEntryListRow (). Get (0) .getID ());

Объект ответа в этом случае поддерживает строки из ответа. К ним можно получить доступ с помощью метода getRows. Из строк можно получить определенную строку по индексу с помощью getTableEntryListRow (). Get (0). Из строки at можно получить информацию об идентификаторе записи с помощью метода getID. Это просто, чтобы показать, как вы можете получить информацию в объектах сообщения. На практике вы, вероятно, будете создавать экземпляры объектов для определенных частей сообщения и, при необходимости, использовать их в своей клиентской программе.

ZIP-файл, содержащий код Java для этого примера: JAXBBindingExample ,

Похожие

План семантического веба
... с-Ли Дата: сентябрь 1998 года. Дата последнего изменения: $ Дата: 1998/10/14 20:17:13 $ Статус: попытка дать высокоуровневый план архитектуры Semantic WWW. Статус редактирования: Черновик. Комментарии приветствуются До вопросов дизайна Дорожная карта на будущее, архитектурный план, не проверенный ничем, кроме мысленных экспериментов. Это было написано как часть запрошенной
Новое: совместная работа в Интернете и в автономном режиме с Overleaf и Git (бета)
... ия git Overleaf теперь также доступна в Overleaf v2 , Обратите внимание, что формат удаленных Git изменился в Overleaf v2 - пожалуйста, посмотрите сообщение, которое вы получите, если вы все еще используете пульты Git Overleaf в стиле v1, как те, что в этом сообщении в блоге. Одна из наиболее востребованных вами функций - ссылка между Overleaf и Git - теперь
Для конечной точки BizOps приложения WSDL можно просматривать по тому же URL-адресу, что и конечная точка с квалификацией?
Что дает нам связывание?
Но что у нас сейчас?
Encoding = "UTF-8" standalone = "yes"?
Substring (56); Строка top = "<?
Encoding = \" utf-8 \ "?
Lt;?
Encoding = "utf-8"?
Encoding = "utf-8"?
Encoding = "utf-8" ?