jax-ws на методе glassfish3 init - PullRequest
       36

jax-ws на методе glassfish3 init

2 голосов
/ 30 марта 2010

Я создал простой сервис jax-ws (аннотированный класс Java 6 для веб-службы) и развернул его на glassfish v3. Web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
  <servlet-name>MyServiceName</servlet-name>
  <description>Blablabla</description>
  <servlet-class>com.foo-bar.somepackage.TheService</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>MyServiceName</servlet-name>
  <url-pattern>/MyServiceName</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>

В войне нет sun-jaxws.xml. Сервис работает нормально, но у меня есть 2 проблемы: Я использую пакет общей конфигурации apache для чтения своей конфигурации, поэтому у меня есть функция init, которая вызывает конфигурационные вещи. 1. Как я могу настроить метод init для службы jaxws (как я могу сделать для сервлетов, например) 2. параметр загрузки при запуске не влияет на сервис, я вижу, что для каждого запроса вызывается функция инициализации снова (и c-tor). Как я могу установить область для моей услуги?

Большое спасибо,

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Как настроить метод init для службы jaxws (как, например, для сервлетов)

Конечные точки JAX-WS, как веб, так и EJB, могут иметь дополнительные методы жизненного цикла, которые автоматически вызываются при их наличии. В качестве метода жизненного цикла можно использовать любой метод с правильной аннотацией:

  • @PostConstruct - вызывается контейнером до того, как реализующий класс начинает отвечать клиентам веб-служб.

  • @PreDestroy - Вызывается контейнером до удаления конечной точки из операции

Так что аннотирование вашего init() метода с помощью @PostConstruct должно сработать.

параметр загрузки при загрузке не влияет на службу, я вижу, что для каждого запроса функция init вызывается снова

Попробуйте сначала использовать предложенную аннотацию. И если вы все еще сталкиваетесь с неожиданным поведением, опубликуйте свой код.

0 голосов
/ 31 марта 2010

Спасибо за быстрый ответ, Паскаль.

Кстати, я настоятельно рекомендую использовать «действительный» сервлет 2.5 или сервлет 3.0 web.xml (используя атрибут version в элементе web-app и объявление xsd).

Я использую версию 2.5, я просто не вставил эту часть в свой пост

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<description>WebTier for the Login Manager Service</description>
<display-name>LoginManagerWAR</display-name>

<servlet>
    <description>Endpoint for Login Manager Web Service</description>
    <display-name>LoginManagerControllerService</display-name>
    <servlet-name>LoginManagerController</servlet-name>
    <servlet-class>loginmanager.controller.LoginManagerController</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>LoginManagerController</servlet-name>
    <url-pattern>/LoginManagerControllerService</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>54</session-timeout>
</session-config>

PostConstruct работает нормально, спасибо, но загрузка при запуске все же не произошла.

@WebService(
name="LoginManagerController",
serviceName="LoginManagerControllerService"
)

public class LoginManagerController {   
private ILoginManager manager;

@Resource
private WebServiceContext wsContext;

@PostConstruct
private void init(){
     .....
    }

Более того, теперь каждый клиентский запрос выполняет 2 вызова init () веб-службы: как я могу видеть в цепной пиле, сначала вызывается init () службы, затем вызывается снова, а затем - фактически клиентская функция (я печатаю хэш-код экземпляра класса webservice и тот же экземпляр для обоих вызовов !!!):

> Метод сообщения внутри init () ... controller = 31641446

> Менеджер входа в систему сообщений = 11229828

> ..... инициация элементов .... блаблабла .....

> Метод выхода из сообщения init ()

> Метод сообщения внутри init () ... controller = 31641446

> Менеджер входа в систему сообщений = 32361523

Контроллер - это служба, и менеджер (чей хэш-код был изменен с первого вызова на второй) создан внутри init () контроллера.

Я не понял, что не так ...

UPDATE Это похоже на проблему, связанную с glassfish v3 (может быть, моя настройка env или конфигурация glassfish). Я попробовал эту войну на Sailfin и Glassfish V2, и она отлично работает ....

...