关于glassfish3 init方法的jax-ws

时间:2010-03-30 12:05:48

标签: java web-services glassfish jax-ws

我已经创建了简单的jax-ws(anotated Java 6 class to web service)服务,并在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.如何为jaxws服务配置init方法(例如我可以为servlet执行) 2. load on startup参数不影响服务,我看到每次请求init函数再次调用(和c-tor)。如何设置我的服务范围?

非常感谢,

2 个答案:

答案 0 :(得分:2)

  

如何为jaxws服务配置init方法(例如我可以为servlet执行)

Web和EJB的JAX-WS端点可以具有可选的生命周期方法,如果存在则自动调用这些方法。任何方法都可以用作具有正确注释的生命周期方法:

  • @PostConstruct - 在实施类开始响应Web服务客户端之前由容器调用。

  • @PreDestroy - 在端点从操作中删除之前由容器调用

使用init()注释您的@PostConstruct方法应该可以解决问题。

  

load on startup参数不影响服务,我看到每次请求init函数再次调用

首先尝试使用建议的注释。如果您仍然面临意外行为,请发布您的代码。

答案 1 :(得分:0)

感谢快速回答,Pascal。

  

BTW,我热烈建议使用“有效”的servlet 2.5或servlet 3.0 web.xml(使用web-app元素和xsd声明中的version属性)。

我正在使用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(){
     .....
    }

此外,现在每个客户端请求都会对webservice进行2次init()调用: 就像我在电锯中看到的那样,首先调用服务的init(),然后再次调用,然后调用实际客户端的函数(我打印webservice类实例的哈希码,两个调用的实例相同!!!):

<强>&GT;消息内部init()方法... controller = 31641446

<强>&GT;消息登录管理器= 11229828

<强>&GT; .....元素的初始化...... blablabla .....

<强>&GT;消息退出init()方法

<强>&GT;消息内部init()方法... controller = 31641446

<强>&GT;消息登录管理器= 32361523

控制器是在控制器的init()内创建的服务和管理器(从第一次调用到第二次调用的哈希码)。

我不明白出了什么问题......

<强>更新 这似乎是一个与glassfish v3相关的问题(也许是我的env设置或glassfish配置)。我在Sailfin和Glassfish V2上尝试过这场战争,它完美地运作......

相关问题