【问题标题】:jax-ws on glassfish3 init methodglassfish3 初始化方法上的 jax-ws
【发布时间】:2011-02-02 10:45:25
【问题描述】:

我创建了简单的 jax-ws(将 Java 6 类注释为 Web 服务)服务并将其部署在 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。 该服务工作正常,但我有两个问题: 我正在使用 apache 通用配置包来读取我的配置,所以我有调用配置内容的 init 函数。 1.如何为 jaxws 服务配置 init 方法(例如我可以为 servlet 做的) 2. load on startup 参数不影响服务,我看到每个请求的 init 函数再次被调用(和 c-tor)。如何设置服务范围?

非常感谢,

【问题讨论】:

  • 顺便说一句,我强烈建议使用“有效”的 servlet 2.5 或 servlet 3.0 web.xml(在 web-app 元素和 xsd 声明中使用 version 属性)。

标签: java web-services glassfish jax-ws


【解决方案1】:

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

JAX-WS 端点,包括 Web 和 EJB,可以有可选的生命周期方法,如果存在的话会被自动调用。任何方法都可以作为生命周期方法使用正确的注解:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    感谢您的快速回答,帕斯卡。

    顺便说一句,我强烈建议使用“有效”的 servlet 2.5 或 servlet 3.0 web.xml(使用 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(){
         .....
        }
    

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

    > init() 方法中的消息 ... controller=31641446

    >消息登录管理器=11229828

    > .....元素的初始化....blablabla .....

    > 消息退出 init() 方法

    > init() 方法中的消息 ... controller=31641446

    >消息登录管理器 = 32361523

    控制器是在控制器的 init() 中创建的服务和管理器(哈希码已从第一次调用更改为第二次调用)。

    我没明白怎么回事....

    更新 这似乎是一个与 glassfish v3 相关的问题(可能是我的环境设置或 glassfish 配置)。我在 Sailfin 和 Glassfish V2 上尝试了这场战争,并且它运行良好....

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多