| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Разработка веб-сервисов |
| Автор: tux 15.9.2005, 14:16 | ||||||||||||
| Предлагаю альтернативный способ разработки веб-сервисов в сравнении с тем, что предлагал Domestic Cat в статье http://forum.vingrad.ru/index.php?showtopic=42367. 1. Что нужно для работы Нужен Axis (у меня версия 1.2.1), Xerces (2.4.0), Jakarta Ant, какой-нибудь веб-контейнер. Изначальная цель – сделать все удобным для разработки, поэтому организуем весь код аккуратно по каталогам, пишем скрипт для Ant, который выполняет всю работу от компиляции до сборки приложения. 2. Создаем структуру каталогов У меня весь проект организован таким образом:
3. Написание сборщика проекта В корневом каталоге проекта создаем файл build.xml для Jakarta Ant, который и будет заниматься сборкой проекта. У меня файл имеет следующий вид:
Здесь цель init определяет набор используемых свойств. Цель define-tasks определяет тэги Axis, которые можно использовать внутри скриптов Ant, для того чтобы они работали нужна библиотека axis-ant.jar, входящая в состав Axis. В результате выполнения taskdef определятся три тэга – axis-java2wsdl, axis-wsdl2java и axis-admin, которые можно использовать для генерации разных нужных файликов. Цель compile используется для компиляции исходных и сгенерированных классов. Цель pack-it собирает все, что сгенерировано и написано в веб-приложение. 4. Процедура разработки веб-сервиса Для того, чтобы было понятно что происходит в цели generate-wsdd опишу выбранную процедуру разработки. Описана она в документации по Axis и включает в себя следующие этапы:
Тэг axis-java2wsdl генерирует документ WSDL. В тэге определены такие атрибуты: classname – класс, для которого генерируется WSDL, classpathref – ссылка на переменную описания class-path в цели init, location – местоположение веб-сервиса, namespace – пространство имен, в котором находится веб-сервис и, наконец, output – файл WSDL, который должен получиться. Для генерации тэг испольет откомпилированный класс, поэтому компиляция в проекте вызывается дважды – перед генерацией WSDL (генерация должна основываться на актуальной информации) и перед сборкой веб-приложения. Тэг axis-wsdl2java генерирует заглушки, интерфейсы и дескрипторы развертывания. Атрибуты означают следующее: output – каталог, куда будут генерироваться файлы, skeletondeploy, serverside, helpergen определяют что имеенно будет сгенерировано, url – ссылка на WSDL-файл, используемые для генерации, implementationclassname – имя класса реализации вебсервиса. На последнем остановлюсь подробнее. Если задать этот атрибут, Axis не будет перегенерировать класс реализации, соответственно, в противном случае ситуация чревата потерей изменений в классе. Тэг mapping внутри axis-wsdl2java определяет как пространства имен отражены на пакеты Java и, следовательно, то, в каком пакете окажутся сгенерированные файлы. Далее запускается класс org.apache.axis.utils.Admin, который использует дескриптор развертывания deploy.wsdd для создания серверного дескриптора и который по какой-то причине не описан в документации. Ему передаются следующие параметры: «server» говорит о необходимости генерации серверного дескриптора, следующий далее дескриптор веб-сервиса используется для регистрации веб-сервиса. Если приложение включает в себя несколько веб-сервисов, то в существующий серверный дескриптор сведения о новых веб-сервисах будут добавлены. К сожалению, поскольку классы вебсервисов нельзя указать пачкой, придется конструкцию в цели generate-wsdd выполнять для каждого класса реализации веб-сервиса. 5. Выполняем всё вместе Пишем класс, который и будет веб-сервисом. Начнем с простого класса, который определяет интерфейс веб-сервиса. В дальнейшем методы в класс можно безболезненно добавлять.
Запускаем Jakarta Ant в корневом каталоге проекта. В результате получаем в пакете ru.esstu.testing.remote.worker.stub такой набор файлов:
В каталоге generate/wsdl файл RemoteWorker.wsdl, в каталоге target веб-приложение в файле testing-remote.war, которое можно развернуть на веб-контейнере. Однако, пока у нас нет реализации вебсервиса. В процессе выполнения build.xml Axis сгенерировал в том числе и новый класс реализации. Пишем в нем, например, следующее:
и пересобираем проект. Теперь веб-приложение действительно можно развернуть куда надо. Теперь пишем клиент чтобы проверить как работает конструкция.
Результатом работы клиента должна быть пара нужных строк на экране. Несмотря на относительную сложность, IMHO, способ обладает большей гибкостью в сравнении со способом, предложенным уважаемым Domestic Cat. |
| Автор: smbd 23.1.2006, 14:28 |
| Гм, немного припозднился... Тут пара вопрсоов появилась. 1) откуда берутся файлы web.xml (прежде всего! без него war не выполняется), server-config.wsdd (тоже непонятно). Просто web.xml у меня нет в принципе, а server-config.wsdd создаётся, но непонятно, кем, и главное, зачем. 2) вызов Wsdl2java создаёт кучу "заглушек". В том числе и интерфейс, который основан на моём классе, переданном Java2wsdl, и класс реализации web сервиса, наследующий от этого интерфейса. Нельзя ли как-то автоматизировать это дело так, чтоб мой изначальный класс (по которому строится) .wsdl файл, и был тем, кто реализует web сервис? Хотя с другой стороны, он должен наследовать интерфес, который ещё не сгенерирован. Криво как-то получается. Или всё же я недопонимаю? Спасибо заранее! P.S. если имеет значение, Axis у меня 1.3 |
| Автор: tux 24.1.2006, 03:39 | ||
| Действительно Ну, значится, по порядку. 1. web.xml придется написать ручками. В общем-то для Axis от приложения к приложению мало изменяется, я его приводить не стал. Должен быть примерно таким:
2. server-config.wsdd генерится вызовом класса org.apache.axis.utils.Admin. А потом удаляется в цели pack-it после того, как упаковывается в war. Поэтому наверное и не понятно откуда он берется. 3. Насчет возможности использования исходного класса как реализации веб-сервиса. Согласен, довольно криво получается, но когда я веб-сервисами занимался, другого способа не нашел. Возможно он есть, а может быть и нет, ничего точно утверждать не могу. Что навскидку приходит в голову - использовать паттерн Delegate. С другой стороны, интерфейс веб-сервиса ведь проектируется один раз и генерация класса реализации не должна быть проблемой. |
| Автор: YuG 20.2.2006, 17:30 |
| 2tux: Огромное спасибо за такую подробную инструкцию! Просто мега-спасибо!!! |
| Автор: Codename 5.4.2006, 07:43 |
| Да действительно классная инструкция. Только вот у меня почему-то war-файл из Tomcat не запускается с чем это может быть связано? |
| Автор: tux 5.4.2006, 07:59 |
| Что Tomcat при этом сообщает? |
| Автор: Codename 5.4.2006, 09:05 |
| Сую war файл в weapps, захожу через менеджер и получаю HTTP Status 404 - /testing-remote/ type Status report message /testing-remote/ description The requested resource (/testing-remote/) is not available. Apache Tomcat/5.0.28 |
| Автор: Codename 5.4.2006, 10:05 |
| War-файл он распечатывает, а логах пишет следующее: - Installing web application at context path /testing-remote from URL file:C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/testing-remote - End event threw exception java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor46.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:216) at org.apache.commons.digester.CallMethodRule.end(CallMethodRule.java:505) at org.apache.commons.digester.Rule.end(Rule.java:276) at org.apache.commons.digester.Digester.endElement(Digester.java:1058) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.commons.digester.Digester.parse(Digester.java:1548) at org.apache.catalina.startup.ContextConfig.applicationConfig(ContextConfig.java:263) at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:624) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:216) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4290) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595) at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277) at org.apache.catalina.core.StandardHost.install(StandardHost.java:832) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:625) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:431) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091) at org.apache.catalina.core.StandardHost.start(StandardHost.java:789) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478) at org.apache.catalina.core.StandardService.start(StandardService.java:480) at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313) at org.apache.catalina.startup.Catalina.start(Catalina.java:556) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.commons.launcher.ChildMain.run(ChildMain.java:269) Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BasicService at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2234) at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2214) ... 52 more - Parse error in application web.xml java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BasicService at org.apache.commons.digester.Digester.createSAXException(Digester.java:2540) at org.apache.commons.digester.Digester.createSAXException(Digester.java:2566) at org.apache.commons.digester.Digester.endElement(Digester.java:1061) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.commons.digester.Digester.parse(Digester.java:1548) at org.apache.catalina.startup.ContextConfig.applicationConfig(ContextConfig.java:263) at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:624) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:216) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4290) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595) at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277) at org.apache.catalina.core.StandardHost.install(StandardHost.java:832) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:625) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:431) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091) at org.apache.catalina.core.StandardHost.start(StandardHost.java:789) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478) at org.apache.catalina.core.StandardService.start(StandardService.java:480) at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313) at org.apache.catalina.startup.Catalina.start(Catalina.java:556) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.commons.launcher.ChildMain.run(ChildMain.java:269) Добавлено @ 10:06 да, еще не дописал - Occurred at line 46 column 23 - Marking this application unavailable due to previous error(s) - Error getConfigured - Context startup failed due to previous errors |
| Автор: tux 5.4.2006, 10:12 | ||
Удали из web.xml вот этот фрагмент, все должно заработать.
|
| Автор: Codename 5.4.2006, 11:50 |
| Да, пошел как надо. А как насчет работы с базами данных. Если у меня скажем есть прога, которая работает с базой через hibernate, то возможно ли ее сделать веб-сервисом, который бы проверял наличие объекта в базе. То бишь реально ли, что бы клиент называл, что хочет найти, а веб-сервис делал всю грязную работу: рылся в базе данных и выводил результат? Если да, то как засунуть методы создания и поиска объекта? |
| Автор: tux 5.4.2006, 12:12 | ||
Реально, конечно. Определяешь методы сервиса какие тебе нужно для создания и поиска объекта, реализуешь класс сервиса, в котором работаешь с hibernate. Вот, собственно, и все. Только учитывай, что в качестве параметров и возвращаемого результата методов могут быть только определенный набор типов данных (подробности в документации к Axis), так просто любой Java-класс передать не удастся. Если нужны все-таки сложные типы данных, то рекомендовал бы Hessian или Burlap (если конечно нет жесткого требования делать на Axis). |
| Автор: JUncle 15.4.2006, 10:47 |
| Прочитал обе части данной темы. Действительно, тема очень важная. Возник вопрос. А вот если есть необходимость связать .NET клиента с Java сервером (обмениваются уведомлениями и не очень сложными данными - с легкостью приводимыми, скажем, к текстовому виду). Причем подключение к серверу скорее всего, только http (в принципе, полагаю, что сервер может подключиться к клиенту и каким то иным способом), а клиента необходимо уведомлять о наступлении событий в сервере в некоторые недетерминированные моменты времени. Подскажите пожалуйста, возможно ли это, и если да - то какие средства лучше использовать (и если можно, ссылки). PS: мы бы конечно какой-нибудь велосипед и придумали бы, но хотелось бы все сделать красивым и общепринятым методом. |
| Автор: tux 15.4.2006, 16:03 |
| В MSDN описываются способы взаимодействия .NET и J2EE, может быть поможет - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/jdni.asp. |
| Автор: JUncle 16.4.2006, 10:52 |
| Благодарю. |
| Автор: Stampede 19.4.2006, 23:02 | ||
Уведомление (callback) HTTP клиентов о серверных событиях - это вообще давняя и больная тема. Решения существуют, но достаточно нетривиальные. Хотя сама по себе идея достаточно простая: Сервер получает запрос, но использует его на для посылки ответа, а удерживает открытое соединение, чтобы сливать туда какие-то сообщения - в том или ином формате. Например, XML, хотя и не обязательно. При такой схеме уже сервер берет бразды праления в свои руки и становится инициатором взаимодействия. Если, например, такой сервлет зарегистрировать как листенера каких-то серверных событий (например, поступление нового заказа), то он может по каждому событию выдавать в канал описание этого заказа. Задача приемной стороны - слушать канал и интерпретировать поступающие сообщения. В браузере это можно сделать посредством JavaScript объекта HttpXMLRequest (который вовсю используется для разработки AJAX приложений). Если клиент не браузерный, то принцип остается все равно тот же, открывать HTTP соединение, слушать, интерпретировать и предпринимать какие-то действия. Вот тут я собрал ссылки на ряд ресурсов. в которых обсуждаются детали транспорта, серверного и клиентского программирования: http://www.bluishcoder.co.nz/2005/11/more-on-ajax-and-server-push.html; http://www.javaworld.com/jw-03-2000/jw-03-pushlet-p4.html (статья аж от 2000-го года, но при этом удивительно актуальная!); Ну и там далее по ссылкам. Теперь возвращаясь к теме взаимодействия Java сервера и .NET слиента. Поскольку никакой AXIS или SOAP не поможет организовать уведомление клиента штатными средствами, плюс учитывая, что формат данных, как ты говоришь, достаточно простой, то я бы на твоем месте разработал свой простенький XML-протокольчик, и взяв за основу описанный выше метод коммуникации наваял бы фреймворк для асинхронного двустороннего клиент-серверного взаимодействия. Да, а в части сериализации объектов в XML формат, я бы воспользовался чем-нибудь типа http://xstream.codehaus.org/ или http://www.caucho.com/burlap/, тем более что для XStream и Hessian существуют порты на .NET: http://www.jroller.com/page/CoBraLorD/20050427 http://www.caucho.com/hessian/ |
| Автор: JUncle 27.4.2006, 20:56 |
| Stampede, большое спасибо за такой развернутый ответ! То, что нужно! (эхх... прав мало - плюс бы дать... |
| Автор: tux 28.4.2006, 02:59 |
Не проблема, дадим. |
| Автор: Aazmandius 28.8.2006, 16:22 | ||||
Вот собрал вышеприведенный пример, долго воевал с различными версиями библиотек, наконец-то нормально скомпилилось и отдеплоилось... Но когда попытался приконнектиться клиентом, получил вот это:
Подскажите в чем дело пожалуйста, эта тема для меня пока еще очень новая, поэтому сам я чего-то недогоняю... Как бы сам смысл ошибки ясен, ему нужен интерфейс в качестве прокси, но что конкретно надо менять в коде? Это происходит в момент обращения собственно к службе в строке
|
| Автор: Aazmandius 28.8.2006, 16:58 |
| Теперь другая проблема - метод, который должен вернуть строку (наше любимое "Превед, мир!" |
| Автор: Aazmandius 29.8.2006, 19:54 |
| Зато по методу уважаемого Domestic Cat все работает великолепно =) Хотя хотелось бы конечно понять причину этого null в предыдущем случае... |
| Автор: y3u 10.9.2006, 16:39 |
| а нет такой же инструкции по работе с вебсервисами на JBoss? Уж больно там мануал сухой и не везде понятный. Вот, к примеру как сам сервис поднять я разобрался, а вот клиента к нему сделать не получилось (я пробвал RPC) |
| Автор: onsh76 2.10.2006, 10:51 | ||
[QUOTE=Stampede,19.4.2006, 23:02]
Я согласен со Стампидом - веб сервис с Hessian/Burlap имплементацией просто песня, минимум кода и никаких плясок с бубном. Испытал на своем проекте, рекомендую... У меня вопрос к почтенной публике: Коллеги, скажите, кому довелось поработать с Axis2? Меня интересует, тема асинхронных вызовов... Никак AJAX опять прикручивать надо? Нет наверное в мире чудес... Проясните, заранее спасибо! |
| Автор: Stampede 2.10.2006, 19:11 |
| onsh76, а посмотри на http://labs.jboss.com/portal/jbossremoting Судя по описанию, очень толковая и давно напрашивавшаяся штука: универсальный ремоутинг с конфигурируемым транспортом, подтыкаемыми сериализаторами, асинхронными вызовами, коллбаками (callbacks), интеграцией с JMX и т. д. и т. п. Может поставляться изолированно, весит немного. Очень интересно было бы услышать впечатления от использования в реальном проекте. |
| Автор: Slanix 11.10.2006, 15:36 |
| Всем, доброго времечки.А вот такая проблемка. Есть Web service (AXIS 1.3, doc/literal) и java клиент. Всё прекрасно работает. Потребовалось написать .NET клиента. Хорошо, написали запускаем. В итоге получем. При обращеннии Net клиента SOAP сообщения ходят, но в качестве респонса всегда null (хотя ответ есть). После такого обращения java клиент не работает, а в частности посылает реквест, а в ответ эксепшн: org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. Спасает только перезапуск приложения. |
| Автор: seth 8.12.2006, 16:39 |
| В чем отличия между например POJO и AXIOM? |
| Автор: tux 8.12.2006, 16:58 |
Во всем. У них нет совершенно ничего общего. |
| Автор: seth 8.12.2006, 18:23 |
| Ну а в двух словах? |
| Автор: tux 8.12.2006, 18:41 |
| POJO (Plain Old Java Object) - абревиатура, обозначающая простые классы Java, на которые не налагается никаких ограничений - они не реализуют никаких интерфейсов, к ним не предъявляется никаких требований, просто классы и все. AXIOM - объектная модель представления XML-данных, аналогичная различным DOM-моделям. Разрабатывалась для Axis 2, но сейчас вроде бы отдельный проект. Между POJO и AXIOM нет никакой связи, поэтому об отличиях или сходствах говорить как-то странно. |
| Автор: rrrookie 18.1.2007, 11:30 | ||
| Я немного отойду от актуалЬных обсуждений... У меня вопрос по субй... РеалЬная ситуация с веб сервисами... Например у нас естЬ метод :
Который отбирает из базы персон, и кладёт их в обЬект класса GetPersonByNameResponseDocument , который соодержит в себе атрибут Person[]. Так вот, вопрос в том, как поведут себя веб сервисы, если в базе лежат 1 000 000 персон? Судя по архитектуре все ети персоны будут складыватся в оперативную памятЬ (в массив) и толЬко потом из етого будет создан ХМЛ... Такая ситуация как то обработана? В моём случае как Web Service engine исполЬзуется AXIS2, а веб сервер Tomcat6. |
| Автор: tux 18.1.2007, 11:39 |
| Насколько я понимаю для таких случаев используются сообщения с аттачментами. Подробностей не знаю. |
| Автор: sandello 18.4.2007, 07:18 |
C тех пор что-то изменилось? |
| Автор: Tony 7.6.2007, 19:34 |
| Interrsnaja statejka: http://www.netbeans.org/kb/50/jaxws20.html Cel' ne NetBeans,a ispol'zovanie JAX-WS tehnologii. |
| Автор: Киска 27.8.2007, 17:20 |
| Здравствуйте!!! Помогите, плиз, разобраться: при попытке запуска приложения, использующего шаблоны http страниц на Tomcat 4.1 столкнулась с тем, что они просто не работают. Томкат 4.1 на самом деле не умеет работать с шаблонами или это всё таки моя ошибка??? |
| Автор: tux 27.8.2007, 18:03 |
| Киска, о каких шаблонах речь? |
| Автор: kkorsakoff 29.11.2007, 20:58 |
| Начал потихоньку разбираться с JWSDP. Вопрос такой: как лучше организовать сессионность? 1. Искуственно: назначая при первом запросе некий sessionId, который клиент затем будет передавать в каждый метод 2. Вроде можно достучаться то HttpSession. Есть ли гарантии, что HttpSession будет работать так, как было бы логично Поделитесь мнениями P.S. С версиями конечно веселуха. Несколько часов убил, чтобы скрестить IDEA, JSWDP, идеевский плагин к нему и tomcat5! Складывается впечатление излишне усложненной технологии или абсолютно черезжопной имплементации. Простите за мой французский |
| Автор: Maksym 29.11.2007, 21:20 |
| kkorsakoff Сори за офтоп, но когда название технологии -- это аббревиатура длинной более четырех букв, у меня почему то возникают подозрения о "черезжопной имплементации"... |
| Автор: powerOn 29.11.2007, 22:33 |
| JWSDP - 'Java Web Service Developer Pack' - это название продукта, а не название технологии ;) |
| Автор: Maksym 30.11.2007, 12:50 | ||
Определяющее слово "аббревиатура длинной более четырех букв".. |
| Автор: kkorsakoff 4.12.2007, 01:25 |
| Никто с WS не работает похоже Ладно, второй вопрос в пустоту... Есть ли время жизни запроса? Требуется сделать запрос и ждать неизвестное кол-во времени, пока на сервере не произойдет некое событие, тогда он и ответит что-то. Если я просто повисну на запросе, не вылетит ли где-то таймаута? Знаю, есть асинхронные вызовы (и два способа работы с ними, polling и callback), но прикол в том, что на сервере ничего не меняется. Разница только на клиенте и то в том, что в случае async-работы мой поток может делать что-то полезное. Мне в принципе это не надо, ...что говорится, не жалко...пусть повисит себе Или в случае async "транспортная часть" клиента (не знаю, как правильно назвать, короче реализация транспорта ws по http) знает, что запрос асинхронный и таймаут только в этом случае не устанавливает? |
| Автор: kkorsakoff 5.12.2007, 18:51 | ||||||
Сам спрашиваю, сам отвечаю Может кому пригодится. По-умолчанию сессия не поддерживается, то есть каждый запрос клиент посылает без поддержки сессии (куки, урл). Чтобы включить поддержку сессии, необходимо на клиенте выполнить:
На сервере ничего менять не надо До сессии можно достучаться из WebServiceContext
|
| Автор: kaa 15.7.2009, 22:23 |
| Удалил что бы не было дублирования |
| Автор: Molodec 22.12.2010, 14:26 |
| Здравствуйте, не хочется тем много создавать из-за своих вопросов. Возможно, кто-то сможет мне помочь. В общем хочу разобраться в Surf_Developer_Tools для Alfresco. Нашёл очень интересную http://wiki.alfresco.com/wiki/Surf_Developer_Tools по настройке. Начал выполнять все, как там сказано, но у меня возникли проблемы на этапе: Surf Addon for Spring Roo. Я пропустил его, решив, что возможно без него все заработает, но нет - результат отрицательный. Так что снова вернулся к нему. Вот собственно в чем тут дело: Скачал я SpringSourse Tool Suite, в котором содержится Roo версии: roo-1.1.0.RELEASE На первый взгляд он нормально работает, но Spring Surf Roo Addon ставится на старую версию Roo: /<sts_install>/roo-1.0.0.RC2/dist А у меня более новая. И на этапе Set up a Spring Project manually. При попытке выполнить это: Type in project --topLevelPackage org.alfresco and press enter. This will generate a basic Spring project. Roo выдаёт ошибку: Command '--topLevelPackage org.alfresco' not found (for assistance press CTRL+SPACE or type "hint" then hit ENTER) No remote OBR repositories have matching add-ons matching your request Поэтому я подозреваю, что плагин на новой версии не работает. Пытаюсь найти старую версию Roo - не удаётся, так как все ссылки ведут на оффициальный сайт, где можно скачать самую последнюю версию. Пожалуйста, может если кто знает эту проблему и как её решить, или же знает где скачать более старую версию Roo, помогите. -------- Проблема все та же. Хотя вот это место прошёл: Type in project --topLevelPackage org.alfresco and press enter. This will generate a basic Spring project. Теперь она же обнаружилась при попытке: roo> install surf Command 'install surf' not found (for assistance press CTRL+SPACE or type "hint" then hit ENTER) No remote OBR repositories have matching add-ons matching your request То есть нужна старая версия... Которой нигде не могу найти. Кто может, пожалуйста, помогите. -------- Проблема решена! По данной ссылке, можно скачать как и новую версию SpringSource Tool Suite так и старую, которая включает Roo 1.0.2. Удачи тем, у кого возникнет эта проблема! |