【问题标题】:can we use jaxws-rt.jar as runtime implementation though it includes sun libraries?我们可以使用 jaxws-rt.jar 作为运行时实现,尽管它包含 sun 库吗?
【发布时间】:2016-08-25 08:33:23
【问题描述】:

出于各种原因,许多人建议不要使用sun 包。详细解答here

但是我使用的是 jaxws-rt.jar,它使用了 sun 库。

我想知道我是否应该jaxws-rt.jar。我在 tomcat 容器中运行,我不想包含 Jboss、GlassFish 或任何其他应用程序服务器的 jaxws 实现。

这是我想要做的(设置连接和请求超时)

import com.sun.xml.internal.ws.client.BindingProviderProperties;
import javax.xml.ws.BindingProvider;

((BindingProvider)soapService).getRequestContext()
        .put(BindingProviderProperties.REQUEST_TIMEOUT,REQUEST_TIMEOUT_MILLI);
((BindingProvider)soapService).getRequestContext()
        .put(BindingProviderProperties.CONNECT_TIMEOUT,CONNECT_TIMEOUT_MILLI);

谢谢

【问题讨论】:

    标签: java web-services tomcat jax-ws


    【解决方案1】:

    如您所见,某些行为(例如连接超时)是通过特定于实现的方式控制的。

    如果您不热衷于编译(导入)com.sun 包,一种删除编译时依赖项但设置这些属性以按照您需要的方式控制 JAX-WS 参考实现的方法,您可以尝试只需通过string values 为参考实现设置BindingProvider 请求上下文属性。即使在使用 RI 以外的其他 JAX-WS 运行时运行时,您也可以设置这些属性 - 它不会失败(它可能没有效果)。

    import javax.xml.ws.BindingProvider;
    
    ((BindingProvider)soapService).getRequestContext()
        .put("com.sun.xml.ws.request.timeout", 5000L);
    ((BindingProvider)soapService).getRequestContext()
        .put("com.sun.xml.ws.connect.timeout", 5000L);
    

    这是您问题中两个常量的两个值。 JAXWSProperties.CONNECT_TIMEOUTBindingProviderProperties.REQUEST_TIMEOUT

    【讨论】:

    • 针对 `com.sun.* 包进行编译没有什么问题,如果没有它,编写一些程序或多或少是不可能的,例如使用 JNDI 进行 LDAP 或 COSNaming 的程序。
    • 这不是关于 JNDI 或 COSNaming 的问题。 OP 有一个问题,这个响应提供了一种在没有编译时间依赖的情况下使用的方法。不建议使用 com.sun.*
    • @scotth:谢谢。如果我按照您的建议设置字符串常量,我是否还需要在我的 pom.xml 中具有 jaxws-rt 依赖项。我目前在 pom.xml 中包含此依赖项。而且我还注意到 REQUEST_TIMEOUT 和 CONNECT_TIMEOUT 都是不同的字符串常量。 (根据您提供的链接,com.sun.xml.ws.request.timeout 和 com.sun.xml.ws.connect.timeout)
    • 好眼光。我已经更正了帖子。如果你想使用参考实现,你仍然需要在你的战争中包含罐子(在你的情况下通过 pom 依赖项)。如果您决定切换到其他实现,例如 Apache CXF,使用这些字符串常量值不会中断,但您可能必须以不同方式设置所需的连接/请求超时行为。
    • rt.jar 也不包含任何参考实现。这就是我感到困惑的地方。我可以使用 wsimport 从 wsdl 创建 java 类。但是我需要在类路径中有 jaxws-rt.jar(或其他 RI)来建立肥皂连接?
    【解决方案2】:

    这是个误会。

    即使它包含sun 库?

    它不“包括 sun 库”。它指的是com.sun 库。那是完全不同的事情。两种完全不同的东西。

    出于各种原因,许多人建议不要[使用] sun 包。

    只有一项建议很重要,那就是Note about sun.* packages。其中的执行语句是:

    包含直接调用 sun.* 包的程序不是 100% 纯 Java。

    sun.* 包的存在当然是有原因的,那就是为 JDK 中的各种事物提供实现。如果这是您的程序对这些类的唯一用途,特别是如果您的代码不包含“直接调用sun.* 包”,那么您无需担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 2016-06-17
      • 1970-01-01
      • 2017-01-04
      • 2014-12-19
      • 2012-07-07
      • 2013-09-08
      • 2012-12-03
      相关资源
      最近更新 更多