Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ceссия в WebService, доступ через MessageContext 
:(
    Опции темы
sergioK
Дата 16.10.2010, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



вот код 
Код


public class WSTest {

@Resource
 WebServiceContext wsContext;
    /**
     * Web service operation
     */
    @WebMethod(operationName = "operation")
    public String operation() {
        MessageContext mc = wsContext.getMessageContext();
           HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        return "test operation";
    }

     public static void main(String[] args ){
      WSTest server = new WSTest();
        
        Endpoint endpoint = Endpoint.publish("http://localhost:9595/WSTest", server);
        WSTest w =(WSTest)endpoint.getImplementor();
        w.operation();
        System.out.println(w.getClass().getSimpleName() + " web service start");
      
     }

    }

получаю Exception 

Код

[color=red]Exception in thread "main" java.lang.IllegalStateException: getMessageContext() 
can only be called while servicing a request
    at com.sun.xml.internal.ws.server.AbstractWebServiceContext.getMessageContext(A
bstractWebServiceContext.java:59)
    at com.WSTest.operation(WSTest.java:25)
    at com.WSTest.main(WSTest.java:35)
[/color]




что нужно чтобы  MessageContext coздавался и не двал Эксершион ?

Это сообщение отредактировал(а) sergioK - 16.10.2010, 01:56
PM MAIL   Вверх
kkorsakoff
Дата 16.10.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 6
Всего: 14



Веб-методы нельзя взять так просто и вызвать самому. Откуда он возьмет реквест и сессию, как вы сами то считаете?
А что нужно. Написать клиента для своего веб-сервиса и с помощью него вызывать метод.
PM MAIL WWW ICQ   Вверх
sergioK
Дата 17.10.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(kkorsakoff @ 16.10.2010,  13:07)
Веб-методы нельзя взять так просто и вызвать самому. Откуда он возьмет реквест и сессию, как вы сами то считаете?
А что нужно. Написать клиента для своего веб-сервиса и с помощью него вызывать метод.

я считаю в столбик   smile  main это и есть клиент,для верности я и клиента написал (счас нет под рукой кода)
результат такой же  session=null
PM MAIL   Вверх
afon
Дата 18.10.2010, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



session = null и Exception разные вещи однако ... Кроме того уверены ли вы, что эти вебсервисы имплементят именно сервлет-реквест? Я допустим не уверен.. 
PM MAIL WWW   Вверх
sergioK
Дата 18.10.2010, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(afon @ 18.10.2010,  01:15)
session = null и Exception разные вещи однако ... Кроме того уверены ли вы, что эти вебсервисы имплементят именно сервлет-реквест? Я допустим не уверен..

я тоже на 100% не уверен тогда при каком сценарии работает такой код 
Код


 @Resource
    private WebServiceContext wsContext;
    public int getCounter(){
        MessageContext mc = wsContext.getMessageContext();
        HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        // Get a session property "counter" from context
        if (session == null)
            throw new WebServiceException("No session in WebServiceContext");
        Integer counter = (Integer)session.getAttribute("counter");
        if (counter == null) {
            counter = new Integer(0);
            System.out.println("Starting the Session");
        }
        counter = new Integer(counter.intValue() + 1);
        session.setAttribute("counter", counter);
        return counter;

    }

  и еще пакет javax.servlet в проекте билд ин не присутствует подключить не проблема но само по себе не очень понятно
PM MAIL   Вверх
kkorsakoff
Дата 18.10.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 6
Всего: 14



В принципе понятно. Надо запускать веб-сервисы по нормальному, в контейнере.
Встроенная в JVM имплементация знать не знает про HttpSession и прочее. Она выставляет свои аналоги реквеста под своими внутренними именами. 
Например 
Код

mc.get("com.sun.xml.internal.ws.http.exchange")


Это сообщение отредактировал(а) kkorsakoff - 18.10.2010, 11:01
PM MAIL WWW ICQ   Вверх
sergioK
Дата 18.10.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(kkorsakoff @ 18.10.2010,  10:47)
В принципе понятно. Надо запускать веб-сервисы по нормальному, в контейнере.
Встроенная в JVM имплементация знать не знает про HttpSession и прочее. Она выставляет свои аналоги реквеста под своими внутренними именами. 
Например 
Код

mc.get("com.sun.xml.internal.ws.http.exchange")

что значит по нормальному ?  какая разница кто вызывает WebService? 
написал клиента 
Код

  public class ServiceRunner {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        WSTestService service = new WSTestService();
        WSTest port =  service.getWSTestPort();
        System.out.println(port.operation());

    }
}


mc.get(MessageContext.SERVLET_REQUEST)  по прежнему выдает null 

PM MAIL   Вверх
kkorsakoff
Дата 20.10.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 6
Всего: 14



Я имел ввиду, не вызывать, а деплоить лучше на сервере приложений, а не с помощью Endpoint.publish();
Имплементация Endpoint не создает никаких javax.servlet.http.HttpServletRequest, а работает со своими внутренними аналогами.
И выставляет их под своими внутренними именами.

Что в принципе логично, иначе пришлось бы с каждой JVM тянуть servlet api. Хотя они конечно могли бы описать данное поведение в спеке.

Если хотите использовать всю мощь веб-сервисов, деплойте их на серверах приложенийsmile
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1774 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.