Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Ceссия в WebService


Автор: sergioK 16.10.2010, 01:56
вот код 
Код


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здавался и не двал Эксершион ?

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

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

я считаю в столбик   smile  main это и есть клиент,для верности я и клиента написал (счас нет под рукой кода)
результат такой же  session=null

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

Автор: sergioK 18.10.2010, 10:32
Цитата(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 в проекте билд ин не присутствует подключить не проблема но само по себе не очень понятно

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

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

Автор: sergioK 18.10.2010, 22:38
Цитата(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 

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

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

Если хотите использовать всю мощь веб-сервисов, деплойте их на серверах приложенийsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)