Как создать бин @Singleton, который реализует @WebService - PullRequest
2 голосов
/ 10 августа 2011

РЕДАКТИРОВАНИЕ: полагая, что это ошибка редактора NetBeans 7.0.Он все еще компилируется и может быть развернут.

Я хочу преобразовать свой веб-сервис, который является @WebService; @Stateless, в bean-компонент @Singleton, но когда я заменяю @WebService на аннотацию @Singleton ... я получаю изображениениже, в моем редакторе IDE

Screen Shot of NetBeans IDE

конечно, когда я делаю что-то глупое, например, с использованием @WebService и @Stateless и развертыванием в glassfish, я получаю:

серьезная ошибка: обработка аннотаций не удалась для ...

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

http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html

"Сессионные EJB-компоненты синглтона предлагают функциональность, аналогичную сессионным EJB-компонентам без сохранения состояния, но отличаются от них тем, что существует только один синглтон-компонент.сессионный компонент на приложение, в отличие от пула сессионных компонентов без сохранения состояния, любой из которых может отвечать на запрос клиента.n реализовать конечные точки веб-службы. "

Эта ссылка может указывать на то, что в компиляторе имеется ошибка, исправленная в среде jboss.Я не уверен, связана ли эта проблема, хотя и хотел бы услышать, что думают опытные пользователи.;)

https://issues.jboss.org/browse/EJBTHREE-2161

Вот вывод из Glassfish 3.1

ИНФОРМАЦИЯ: Закрытие корня мониторинга Metro: amx: pp = / mon / server-mon [сервер], тип = WSEndpoint, name = soco.ws.bb.bearBearWS-BearBearImplPort ИНФОРМАЦИЯ: Портативные имена JNDI для EJB StateBean: [java: global / BearBearService / StateBean! soco.ws.bb.StateBean, java: global / BearBearSviceStateBean] INFO: корневое имя мониторинга Metro успешно установлено в: amx: pp = / mon / server-mon [server], type = WSEndpoint, name = soco.ws.bb.bearBearWS-BearBearImplPort ПРЕДУПРЕЖДЕНИЕ: Контейнер org.glassfish.webservices.JAXWSContainer@ 249ef1e не поддерживает класс com.sun.xml.ws.api.server.Module INFO: Переносимые имена JNDI для EJB BearBearImpl: [java: global / BearBearService / BearBearImpl! Soco.ws.bb.BearBearWS, java: global /BearBearService / BearBearImpl] ИНФОРМАЦИЯ: WS00019: развернута конечная точка EJB

Вот выходные данные из glassfish 3.0.1

ИНФОРМАЦИЯ: Rooname мониторинга метрополитена успешно установлено в: amx: pp =/ mon / server-mon [сервер], тип = WSEndpoint, имя= AppleImplService-AppleImplPort ПРЕДУПРЕЖДЕНИЕ: Контейнер org.glassfish.webservices.JAXWSContainer@191f81e не поддерживает класс com.sun.xml.ws.api.server.Module INFO: Портативные имена JNDI для EJB AppleImpl "[java: глобальный / AppleService»AppleImpl! Com.ws.srv.MyService, java: global / AppleService / AppleImpl] ИНФОРМАЦИЯ: WS00019: конечная точка EJB развернула прослушивание AppleService по адресу http://localhost:8080/AppleImplService/AppleImpl ИНФОРМАЦИЯ: AppleService успешно развернута за 438 миллисекунд

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Это ошибка в редакторе NetBeans 7.0. Мне удалось создать и развернуть WS, используя @WebService, @Singleton, хотя имя службы было подчеркнуто красным, чтобы указать на ошибку компиляции. Просто запустил тест, чтобы убедиться, что спецификационный бин работает так, как объявлено. Я предоставлю код ниже и снимок моего тестового интерфейса.

Спасибо @home, @bkali и @Preston за помощь.

Отправлено в NetBeans как ошибка: http://netbeans.org/bugzilla/show_bug.cgi?id=200911

Примечание ниже состояния экземпляра приводит к превышению времени ожидания и изменению с 50 на 0 после периода ожидания (10 минут) при повторном развертывании службы как Singleton вместо состояния без состояния.

Snapshot of Test UI

Тестовый код веб-службы:

import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.jws.WebService;
import javax.jws.WebParam;
import javax.ejb.Stateless;

@WebService(serviceName = "soco.ws.bb.bearBearWS")
@Singleton
//@Stateless
public class BearBearImpl implements BearBearWS {

    int state = 0;
    static int staticState = 0;
    @EJB StateBean sb = new StateBean();

    @Override
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }

    @Override
    public void setAllState(int in) {
        System.out.println("setting instance state from "+state+" to "+in);
        state = in; 
        System.out.println("setting static state from "+staticState+" to "+in);
        staticState = in; 
        System.out.println("setting singleton state from "+sb.state+" to "+in);
        sb.state = in;
    }

    @Override
    public int getInstanceState() { 
        System.out.println("returning instance state "+state);
        return state; 
    }

    @Override
    public int getStaticState() { 
        System.out.println("returning static state "+staticState);
        return staticState; 
    }

    @Override
    public int getSingletonState() { 
        System.out.println("returning singleton state "+sb.state);
        return sb.state; 
    }
}
2 голосов
/ 10 августа 2011

Как указал @bkail, JSR 109 явно разрешает комбинацию @WebService и @Singleton. Глава 3.3.1 гласит:

3.3.1 Компоненты веб-службы

В этой спецификации определяются два средствадля реализации веб-службы, которая работает в среде Java EE, но не ограничивает реализацию веб-службы только этими средствами.Первый - это контейнерное расширение модели программирования JAX-RPC или JAX-WS, которое определяет веб-сервис как класс Java, работающий в веб-контейнере.Второй использует ограниченную реализацию сеансового EJB без сохранения состояния или одноэлементного сеансового EJB (только для служб JAX-WS) в контейнере EJB.Возможны и другие реализации служб, но они не определены в данной спецификации.

Обходной путь может заключаться в том, чтобы в вашем классе веб-служб был атрибут @Singleton с комментариями, а затем делегировать этот единственный элемент:

@WebService
public class MyService {

    @EJB
    private MySingleton singleton;

    public void doSomeService() {
        this.singleton.doSomeService();
    }
}

@Singleton
public class MySingleton {

    // some code ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...