Использование Jax-B с Jax-WS для возврата сложных типов - PullRequest
4 голосов
/ 14 апреля 2011

Я уверен, что у вас есть много вопросов по этому типу вещей здесь, но ни один из ответов, которые я нашел, кажется, не имеет отношения к проблеме, с которой я сталкиваюсь, поэтому я надеялся, что смогу получить конкретные ответы.

У меня есть проект, который состоит из клиента и сервера. Сервер подключается к базе данных, и клиент может вызывать методы на сервере через файл wsdl. Это прекрасно работает, но сервер может возвращать только простые типы и списки. Я посмотрел, как обрабатывать пользовательские типы, и был направлен в JaxB, который, кажется, именно то, что я ищу. К сожалению, я немного смущен тем, как я должен это использовать. Я использую среду IDE NetBeans (6.9.1), которая упрощает работу с файлами wsdl, хотя я читал, что передача сложных классов довольно тривиальна из командной строки, как только вы получили конец wsdl работает нормально?

Я хочу, чтобы сервер возвращал класс - он будет просто содержать данные - которые клиент может читать и использовать.

Я сделал следующее, но, очевидно, я где-то ошибаюсь!

  • У меня есть класс с именем Customer на стороне сервера, который создается и возвращается, когда клиент вызывает определенный метод.
  • Клиент, очевидно, не может правильно интерпретировать этот класс.
  • Я использовал schemagen для создания схемы XML из класса Customer. Затем я использую мастер netbeans, чтобы связать схему с классом в клиенте.
  • Полагаю, это то, где я запутался. Я хочу отменить ответ xml от сервера и использовать его для создания нового объекта на клиенте. Я использую ярлык netbeans "jaxbu", который расширяется до некоторого кода, но я не уверен, как поместить возвращаемый объект в unmarshaller. Если это имеет какой-то смысл?

Код, сгенерированный "jaxbu", аналогичен приведенному ниже, внутри блока try:

javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(c.getClass().getPackage().getName());
javax.xml.bind.Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
c = (CustomerInfo) unmarshaller.unmarshal(new java.io.File("File path"));

Любая помощь будет принята с благодарностью, и если вам потребуется дополнительная информация. пожалуйста, не стесняйтесь спрашивать.

Спасибо, Mathew

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Я не собираюсь помогать с окончательным ответом, но я задал подобный вопрос некоторое время назад и получил указания в этом вопросе.как сказал Блейз Дафан, вам нужно что-то использовать для перемещения по документу xml и найти нужные вам фрагменты, а затем маршалировать их оттуда.*

1 голос
/ 14 апреля 2011

вы не должны делать Jaxb напрямую.вместо этого вы помещаете все сложные типы в схему, связанную с вашим wsdl (при условии, что вы работаете с wsdl).затем вы используете различные инструменты jaxws (wsgen, wsimport) для генерации заглушек и классов jaxb из wsdl (как для клиента, так и для сервера).

в значительной степени все это описано в Руководства по jaxws (metro - эталонная реализация jaxws).

...