【问题标题】:How do I inject @WebServiceRef resources through Glassfish JNDI?如何通过 Glassfish JNDI 注入 @WebServiceRef 资源?
【发布时间】:2011-02-24 21:17:04
【问题描述】:

我的网络应用程序是组织提供的一些内部网络服务的消费者。我见过几个例子,其中使用以下方式注入 Web 服务引用:

@WebServiceRef(name="services/MyService")
MyService myService; 

但我不知道如何在 Glassfish v3 中定义 services/MyService JNDI 对象以便注入。我希望通过 Glassfish 管理定义 Web 服务客户端类,并通过管理控制台指定端点 URL。这样,URL 就不会被硬编码并且易于管理。

最终,除了 URL 之外,我还需要以相同的方式指定用于 HTTP 身份验证的用户名和密码。我该怎么办?

【问题讨论】:

    标签: glassfish jax-ws jndi


    【解决方案1】:

    我不知道定义“全局”JNDI 名称的方法,但您可以在 web.xml 中编写一个 service-ref 元素,它会起作用:

    <service-ref>
      <service-ref-name>services/MyService</service-ref-name>
      <service-interface>service.MyEndpointService</service-interface>
      <wsdl-file>http://example.com/MyWsdl</wsdl-file>
    </service-ref>
    

    然后您可以使用您提到的带注释的字段。

    对于用户名和密码,一旦从服务中获得代理,就可以将其强制转换为 BindingProvider,然后设置属性:

    MySEI proxy = myService.getMyEndpointPort();
    BindingProvider bp = (BindingProvider)proxy;
    Map<String, Object> rc = bp.getRequestContext();
    rc.put(BindingProvider.USERNAME_PROPERTY, "myuser");
    rc.put(BindingProvider.PASSWORD_PROPERTY, "mypass");
    

    【讨论】:

    • 感谢您回答这个长期存在的问题。我想使用你的方法是可行的。用户名和密码也可以是 web.xml 应用程序上下文参数的一部分,以便从同一个地方检索它们。既然我们把它放在 web.xml 中,它也可以在 Tomcat 中工作吗?
    • 我对它在 Tomcat 中的工作表示怀疑,因为 Tomcat 没有实现 JSR-109。不过没试过。
    • 指定端点的实际 URL 怎么样?理想情况下,这也是通过此处配置的。 WSDL 绑定中的 URL 有时不是您要连接的 Web 服务端点的实际 URL。
    • 我认为您不能在 service-ref 中配置 URL,但您可以将其放在 web.xml 中的其他位置,然后在调用服务之前使用 BindingProvider.ENDPOINT_ADDRESS_PROPERTY 进行设置。
    • 您无法更改 WSDL 中定义的端点,但您指向的 WSDL 可以指向服务器生成的具有正确端点地址的 WSDL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多