|
Модераторы: LSD, AntonSaburov |
|
tux |
|
||||||||||||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Предлагаю альтернативный способ разработки веб-сервисов в сравнении с тем, что предлагал Domestic Cat в статье Веб-сервис на Java.
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. Это сообщение отредактировал(а) tux - 24.1.2006, 03:42 |
||||||||||||
|
|||||||||||||
smbd |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 23.1.2006 Репутация: нет Всего: нет |
Гм, немного припозднился...
Тут пара вопрсоов появилась. 1) откуда берутся файлы web.xml (прежде всего! без него war не выполняется), server-config.wsdd (тоже непонятно). Просто web.xml у меня нет в принципе, а server-config.wsdd создаётся, но непонятно, кем, и главное, зачем. 2) вызов Wsdl2java создаёт кучу "заглушек". В том числе и интерфейс, который основан на моём классе, переданном Java2wsdl, и класс реализации web сервиса, наследующий от этого интерфейса. Нельзя ли как-то автоматизировать это дело так, чтоб мой изначальный класс (по которому строится) .wsdl файл, и был тем, кто реализует web сервис? Хотя с другой стороны, он должен наследовать интерфес, который ещё не сгенерирован. Криво как-то получается. Или всё же я недопонимаю? Спасибо заранее! P.S. если имеет значение, Axis у меня 1.3 Это сообщение отредактировал(а) smbd - 23.1.2006, 16:05 |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Действительно И я уже многое забыл поскольку постоянно с веб-сервисами не работаю. Ну, значится, по порядку. 1. web.xml придется написать ручками. В общем-то для Axis от приложения к приложению мало изменяется, я его приводить не стал. Должен быть примерно таким:
2. server-config.wsdd генерится вызовом класса org.apache.axis.utils.Admin. А потом удаляется в цели pack-it после того, как упаковывается в war. Поэтому наверное и не понятно откуда он берется. 3. Насчет возможности использования исходного класса как реализации веб-сервиса. Согласен, довольно криво получается, но когда я веб-сервисами занимался, другого способа не нашел. Возможно он есть, а может быть и нет, ничего точно утверждать не могу. Что навскидку приходит в голову - использовать паттерн Delegate. С другой стороны, интерфейс веб-сервиса ведь проектируется один раз и генерация класса реализации не должна быть проблемой. Это сообщение отредактировал(а) tux - 5.4.2006, 11:59 |
|||
|
||||
YuG |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 160 Регистрация: 20.2.2006 Репутация: 3 Всего: 4 |
2tux:
Огромное спасибо за такую подробную инструкцию! Просто мега-спасибо!!! |
|||
|
||||
Codename |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.4.2006 Репутация: 1 Всего: 1 |
Да действительно классная инструкция. Только вот у меня почему-то war-файл из Tomcat не запускается с чем это может быть связано?
|
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Что Tomcat при этом сообщает?
|
|||
|
||||
Codename |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.4.2006 Репутация: 1 Всего: 1 |
Сую 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 |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Это-то понятно, это уже следствие - приложение не развернулось. А что Tomcat выдает в консоль или логи касательно testing-remote? |
|||
|
||||
Codename |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.4.2006 Репутация: 1 Всего: 1 |
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 |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Удали из web.xml вот этот фрагмент, все должно заработать.
|
|||
|
||||
Codename |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.4.2006 Репутация: 1 Всего: 1 |
Да, пошел как надо. А как насчет работы с базами данных. Если у меня скажем есть прога, которая работает с базой через hibernate, то возможно ли ее сделать веб-сервисом, который бы проверял наличие объекта в базе. То бишь реально ли, что бы клиент называл, что хочет найти, а веб-сервис делал всю грязную работу: рылся в базе данных и выводил результат?
Если да, то как засунуть методы создания и поиска объекта? |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Реально, конечно. Определяешь методы сервиса какие тебе нужно для создания и поиска объекта, реализуешь класс сервиса, в котором работаешь с hibernate. Вот, собственно, и все. Только учитывай, что в качестве параметров и возвращаемого результата методов могут быть только определенный набор типов данных (подробности в документации к Axis), так просто любой Java-класс передать не удастся. Если нужны все-таки сложные типы данных, то рекомендовал бы Hessian или Burlap (если конечно нет жесткого требования делать на Axis). |
|||
|
||||
JUncle |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 162 Регистрация: 6.4.2006 Где: Казань, РФ Репутация: нет Всего: 1 |
Прочитал обе части данной темы. Действительно, тема очень важная.
Возник вопрос. А вот если есть необходимость связать .NET клиента с Java сервером (обмениваются уведомлениями и не очень сложными данными - с легкостью приводимыми, скажем, к текстовому виду). Причем подключение к серверу скорее всего, только http (в принципе, полагаю, что сервер может подключиться к клиенту и каким то иным способом), а клиента необходимо уведомлять о наступлении событий в сервере в некоторые недетерминированные моменты времени. Подскажите пожалуйста, возможно ли это, и если да - то какие средства лучше использовать (и если можно, ссылки). PS: мы бы конечно какой-нибудь велосипед и придумали бы, но хотелось бы все сделать красивым и общепринятым методом. --------------------
class JUncle extends Man // singleton{/*...*/} |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
В MSDN описываются способы взаимодействия .NET и J2EE, может быть поможет - http://msdn.microsoft.com/library/default....g/html/jdni.asp.
|
|||
|
||||
JUncle |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 162 Регистрация: 6.4.2006 Где: Казань, РФ Репутация: нет Всего: 1 |
Благодарю.
--------------------
class JUncle extends Man // singleton{/*...*/} |
|||
|
||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
Уведомление (callback) HTTP клиентов о серверных событиях - это вообще давняя и больная тема. Решения существуют, но достаточно нетривиальные. Хотя сама по себе идея достаточно простая: Сервер получает запрос, но использует его на для посылки ответа, а удерживает открытое соединение, чтобы сливать туда какие-то сообщения - в том или ином формате. Например, XML, хотя и не обязательно. При такой схеме уже сервер берет бразды праления в свои руки и становится инициатором взаимодействия. Если, например, такой сервлет зарегистрировать как листенера каких-то серверных событий (например, поступление нового заказа), то он может по каждому событию выдавать в канал описание этого заказа. Задача приемной стороны - слушать канал и интерпретировать поступающие сообщения. В браузере это можно сделать посредством JavaScript объекта HttpXMLRequest (который вовсю используется для разработки AJAX приложений). Если клиент не браузерный, то принцип остается все равно тот же, открывать HTTP соединение, слушать, интерпретировать и предпринимать какие-то действия. Вот тут я собрал ссылки на ряд ресурсов. в которых обсуждаются детали транспорта, серверного и клиентского программирования: More no AJAX and server push; Pushlest: Send events from servlets to DHTML client browsers (статья аж от 2000-го года, но при этом удивительно актуальная!); Ну и там далее по ссылкам. Теперь возвращаясь к теме взаимодействия Java сервера и .NET слиента. Поскольку никакой AXIS или SOAP не поможет организовать уведомление клиента штатными средствами, плюс учитывая, что формат данных, как ты говоришь, достаточно простой, то я бы на твоем месте разработал свой простенький XML-протокольчик, и взяв за основу описанный выше метод коммуникации наваял бы фреймворк для асинхронного двустороннего клиент-серверного взаимодействия. Да, а в части сериализации объектов в XML формат, я бы воспользовался чем-нибудь типа XStream или Burlap/Hessian, тем более что для XStream и Hessian существуют порты на .NET: XStream for .NET Hessian implementatations -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
JUncle |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 162 Регистрация: 6.4.2006 Где: Казань, РФ Репутация: нет Всего: 1 |
Stampede, большое спасибо за такой развернутый ответ! То, что нужно!
(эхх... прав мало - плюс бы дать... ). Это сообщение отредактировал(а) JUncle - 27.4.2006, 21:05 --------------------
class JUncle extends Man // singleton{/*...*/} |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
||||
|
||||
Aazmandius |
|
||||
O_o Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: 3 Всего: 6 |
Вот собрал вышеприведенный пример, долго воевал с различными версиями библиотек, наконец-то нормально скомпилилось и отдеплоилось... Но когда попытался приконнектиться клиентом, получил вот это:
Подскажите в чем дело пожалуйста, эта тема для меня пока еще очень новая, поэтому сам я чего-то недогоняю... Как бы сам смысл ошибки ясен, ему нужен интерфейс в качестве прокси, но что конкретно надо менять в коде? Это происходит в момент обращения собственно к службе в строке
забыл интерфейс проимплементить... Это сообщение отредактировал(а) Aazmandius - 28.8.2006, 16:47 |
||||
|
|||||
Aazmandius |
|
|||
O_o Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: 3 Всего: 6 |
Теперь другая проблема - метод, который должен вернуть строку (наше любимое "Превед, мир!" ) возвращает null И никаких эксепшнов, все чисто...
|
|||
|
||||
Aazmandius |
|
|||
O_o Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: 3 Всего: 6 |
Зато по методу уважаемого Domestic Cat все работает великолепно =) Хотя хотелось бы конечно понять причину этого null в предыдущем случае...
|
|||
|
||||
y3u |
|
|||
Опытный Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: 7 Всего: 13 |
а нет такой же инструкции по работе с вебсервисами на JBoss?
Уж больно там мануал сухой и не везде понятный. Вот, к примеру как сам сервис поднять я разобрался, а вот клиента к нему сделать не получилось (я пробвал RPC) ... -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
onsh76 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 20.11.2005 Где: Beautiful BC Репутация: 4 Всего: 5 |
[QUOTE=Stampede,19.4.2006, 23:02]
Я согласен со Стампидом - веб сервис с Hessian/Burlap имплементацией просто песня, минимум кода и никаких плясок с бубном. Испытал на своем проекте, рекомендую... У меня вопрос к почтенной публике: Коллеги, скажите, кому довелось поработать с Axis2? Меня интересует, тема асинхронных вызовов... Никак AJAX опять прикручивать надо? Нет наверное в мире чудес... Проясните, заранее спасибо! |
|||
|
||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
onsh76, а посмотри на проект JBoss Remoting
Судя по описанию, очень толковая и давно напрашивавшаяся штука: универсальный ремоутинг с конфигурируемым транспортом, подтыкаемыми сериализаторами, асинхронными вызовами, коллбаками (callbacks), интеграцией с JMX и т. д. и т. п. Может поставляться изолированно, весит немного. Очень интересно было бы услышать впечатления от использования в реальном проекте. Это сообщение отредактировал(а) Stampede - 2.10.2006, 19:12 |
|||
|
||||
Slanix |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 158 Регистрация: 30.1.2004 Репутация: нет Всего: 1 |
Всем, доброго времечки.А вот такая проблемка.
Есть 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. Спасает только перезапуск приложения. --------------------
Я буду искать лица Твоего, Господи Пс.26:8 |
|||
|
||||
seth |
|
|||
Опытный Профиль Группа: Участник Сообщений: 316 Регистрация: 4.6.2006 Репутация: 1 Всего: 1 |
В чем отличия между например POJO и AXIOM?
|
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
||||
|
||||
seth |
|
|||
Опытный Профиль Группа: Участник Сообщений: 316 Регистрация: 4.6.2006 Репутация: 1 Всего: 1 |
Ну а в двух словах?
|
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
POJO (Plain Old Java Object) - абревиатура, обозначающая простые классы Java, на которые не налагается никаких ограничений - они не реализуют никаких интерфейсов, к ним не предъявляется никаких требований, просто классы и все.
AXIOM - объектная модель представления XML-данных, аналогичная различным DOM-моделям. Разрабатывалась для Axis 2, но сейчас вроде бы отдельный проект. Между POJO и AXIOM нет никакой связи, поэтому об отличиях или сходствах говорить как-то странно. |
|||
|
||||
rrrookie |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 87 Регистрация: 21.6.2006 Где: Rīga Репутация: нет Всего: нет |
Я немного отойду от актуалЬных обсуждений...
У меня вопрос по субй... РеалЬная ситуация с веб сервисами... Например у нас естЬ метод :
Который отбирает из базы персон, и кладёт их в обЬект класса GetPersonByNameResponseDocument , который соодержит в себе атрибут Person[]. Так вот, вопрос в том, как поведут себя веб сервисы, если в базе лежат 1 000 000 персон? Судя по архитектуре все ети персоны будут складыватся в оперативную памятЬ (в массив) и толЬко потом из етого будет создан ХМЛ... Такая ситуация как то обработана? В моём случае как Web Service engine исполЬзуется AXIS2, а веб сервер Tomcat6. |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Насколько я понимаю для таких случаев используются сообщения с аттачментами. Подробностей не знаю.
|
|||
|
||||
sandello |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
-------------------- |
|||
|
||||
Tony |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Interrsnaja statejka: dlja realnih pacanov
Cel' ne NetBeans,a ispol'zovanie JAX-WS tehnologii. Это сообщение отредактировал(а) Tony - 7.6.2007, 19:37 |
|||
|
||||
Киска |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.11.2006 Репутация: нет Всего: нет |
Здравствуйте!!!
Помогите, плиз, разобраться: при попытке запуска приложения, использующего шаблоны http страниц на Tomcat 4.1 столкнулась с тем, что они просто не работают. Томкат 4.1 на самом деле не умеет работать с шаблонами или это всё таки моя ошибка??? |
|||
|
||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Киска, о каких шаблонах речь?
|
|||
|
||||
kkorsakoff |
|
|||
Опытный Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
Начал потихоньку разбираться с JWSDP.
Вопрос такой: как лучше организовать сессионность? 1. Искуственно: назначая при первом запросе некий sessionId, который клиент затем будет передавать в каждый метод 2. Вроде можно достучаться то HttpSession. Есть ли гарантии, что HttpSession будет работать так, как было бы логично, вне зависимости от реализации WS-клиента. Поделитесь мнениями P.S. С версиями конечно веселуха. Несколько часов убил, чтобы скрестить IDEA, JSWDP, идеевский плагин к нему и tomcat5! Складывается впечатление излишне усложненной технологии или абсолютно черезжопной имплементации. Простите за мой французский Это сообщение отредактировал(а) kkorsakoff - 29.11.2007, 21:52 |
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
kkorsakoff
Сори за офтоп, но когда название технологии -- это аббревиатура длинной более четырех букв, у меня почему то возникают подозрения о "черезжопной имплементации"... |
|||
|
||||
powerOn |
|
|||
software saboteur Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 28 Всего: 159 |
JWSDP - 'Java Web Service Developer Pack' - это название продукта, а не название технологии ;)
|
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
||||
|
||||
kkorsakoff |
|
|||
Опытный Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
Никто с WS не работает похоже
Ладно, второй вопрос в пустоту... Есть ли время жизни запроса? Требуется сделать запрос и ждать неизвестное кол-во времени, пока на сервере не произойдет некое событие, тогда он и ответит что-то. Если я просто повисну на запросе, не вылетит ли где-то таймаута? Знаю, есть асинхронные вызовы (и два способа работы с ними, polling и callback), но прикол в том, что на сервере ничего не меняется. Разница только на клиенте и то в том, что в случае async-работы мой поток может делать что-то полезное. Мне в принципе это не надо, ...что говорится, не жалко...пусть повисит себе Или в случае async "транспортная часть" клиента (не знаю, как правильно назвать, короче реализация транспорта ws по http) знает, что запрос асинхронный и таймаут только в этом случае не устанавливает? |
|||
|
||||
kkorsakoff |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
Сам спрашиваю, сам отвечаю Может кому пригодится. По-умолчанию сессия не поддерживается, то есть каждый запрос клиент посылает без поддержки сессии (куки, урл). Чтобы включить поддержку сессии, необходимо на клиенте выполнить:
На сервере ничего менять не надо До сессии можно достучаться из WebServiceContext
|
||||||
|
|||||||
kaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: 1 Всего: 2 |
Удалил что бы не было дублирования
Это сообщение отредактировал(а) kaa - 16.7.2009, 09:34 |
|||
|
||||
Molodec |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 249 Регистрация: 20.12.2010 Где: Украина Репутация: 1 Всего: 1 |
Здравствуйте, не хочется тем много создавать из-за своих вопросов.
Возможно, кто-то сможет мне помочь. В общем хочу разобраться в Surf_Developer_Tools для Alfresco. Нашёл очень интересную статью по настройке. Начал выполнять все, как там сказано, но у меня возникли проблемы на этапе: 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. Удачи тем, у кого возникнет эта проблема! Это сообщение отредактировал(а) Molodec - 22.12.2010, 17:40 |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |