Liberty:故障诊断提示
Liberty 故障诊断提示。
为帮助您确定并解决问题,本产品包括统一的记录组件。请参阅记录和跟踪。您还可以使用 ${wlp.install.dir}/bin 目录中的 IBM® Support Assistant Data Collector (ISADC) 命令工具来快速收集诊断文件(例如,日志文件和配置文件)或者运行跟踪。
如果您收到异常消息,那么可以在 Liberty:消息中找到有关该消息的信息。
每个 Liberty API 的 Java™ API 文档均可以在 ${wlp.install.dir}/dev 目录的某个 javadoc 子目录下的单独 .zip 文件中找到。

有关使用 Liberty 时存在的主要已知限制的详细信息,请参阅 Liberty:运行时环境已知问题和限制。
检查 JDK 是否处于支持的级别
如果您遇到尚不具有现成解释的问题,请检查您正在使用的 JDK 是否符合 Java V7 或更高版本的标准,以及是否处于当前服务级别。请参阅支持的最低 Java 级别。
安全性故障诊断
此部分描述了一些常见安全问题以及您可以选择的解决方案。
- SESN0008E: 认证为匿名的用户尝试访问以下用户所拥有的会话:LdapRegistry/cn=steven,o=myCompany,c=US。
- 如果未认证的用户尝试访问由已认证的用户所创建的会话,那么会发生此错误。缺省情况下启用的会话安全性会阻止对会话进行未授权访问。仅创建会话的用户可以访问该会话。有关更多信息,请参阅会话安全性。
如果使用 JSP(例如,login.jsp)进行表单登录,而且浏览器发送的 SSO 令牌到期,那么可能会发生此错误。因为 SSO 令牌到期,所以会提示用户使用针对表单登录而配置的 login.jsp 页面重新登录。缺省情况下,jsp 页面会尝试获取会话。此会话最初是由其令牌已到期的用户创建。因为令牌已到期并且用户未经认证,所以访问此会话时不会建立任何凭证,这将引起此错误。
要避免此错误,请重新启动那个启动新会话的浏览器,或者将 login.jsp 文件配置成缺省情况下不创建会话。如果选择更新 login.jsp 文件,请设置 <%@ page session="false" %>。
- CWWKS9104A: 对 {2} 调用 {1} 时,授权用户 {0} 失败。未向用户授予访问任何必需角色的权限:{3}。
- 如果您对应用程序所需的角色没有权限,那么会发生此错误。请确保用户或用户所属的组已至少映射到错误消息中所提及的其中一个角色。ibm-application-bnd.xmi/xml 文件中所定义的用户到角色映射优先于 server.xml 文件中所定义的映射。检查两个资源以确保定义了正确的映射。请参阅在 Liberty 中为应用程序配置授权。
- CWWKS9104A: 对用户 {0} 授权失败。
- 如果对同一上下文根指定了 application 和 webApplication,那么可能发生此错误。如果发生冲突,那么所定义的最新配置被忽略,并导致意外错误,例如,CWWKS9104A。
- CWWKZ0013E: 无法启动名为 {0} 的两个应用程序,其后是异常安全行为和错误消息,例如 CWWKS9104A。
- 如果使用 application 元素在 server.xml 中和 dropins 文件夹中都指定您的应用程序,那么会发生此错误。因此,会尝试安装您的应用程序两次,这样 server.xml 文件中的安全性配置可能会生效,也可能不会生效。要修正此问题,必须将您的应用程序从 dropins 文件夹中移除,然后将其复制到另一个目录。如果必须将您的应用程序保留在 dropins 文件夹中,那么必须通过在 server.xml 文件中使用下列代码来禁用应用程序监视:
<applicationMonitor dropinsEnabled="false" />
- 未认证的用户可以访问我的 servlet 或 JSP。
- 如果认证失败或者您的 servlet 或 JSP 未受保护,那么将创建主体为 UNAUTHENTICATED 的用户(或 z/OS® 上的未认证 SAF 用户)。如果您未定义任何安全性约束或者您将 EVERYONE 特殊主体集映射到您的应用程序所需的角色,那么未认证的用户可以访问您的 servlet 或 JSP。复审 ibm-application-bnd.xmi/xml 和 server.xml 文件中用户到角色的映射。采用下列其中一个选项:
- 如果您的 servlet 或 JSP 未受保护,请在应用程序的部署描述符中添加安全性约束。请参阅Liberty:认证。
- 如果不想任何未认证的用户访问您的应用程序,请将 EVERYONE 特殊主体集从该角色的映射中移除。请参阅在 Liberty 中为应用程序配置授权。
- 如果不能授权某一用户访问您的 servlet 或 JSP,请通过检查 ibm-application-bnd.xmi/xml 和 server.xml 文件来复审映射到该角色的用户。您可以将角色映射到用户、组或特殊主体集。如果角色已映射到 EVERYONE 特殊主体集,那么会向所有用户授予访问权。如果角色已映射到 ALL_AUTHENTICATED 特殊主体集,那么会向所有已认证的用户授予访问权。如果要进一步限制可以访问您的 servlet 或 JSP 的用户,请移除这些特殊主体集。最后,检查用户所属的组。虽然用户可能没有显式访问权,但组可能已映射到该角色。在这种情况下,将用户从获授权的组中移除或者将组从角色映射中移除。请参阅在 Liberty 中为应用程序配置授权。
- 单点登录 (SSO) 不起作用。
- 如果 SSO 不起作用,请确保不同的 Liberty 服务器(使用 webAppSecurity 元素的相同 LTPA 密钥、密码以及 ssoCookieName 属性)具有相同的世界时间 (UTC) 且共享同一个用户注册表。此外,如果令牌到期或者如果在以不一致的方式更改用户注册表(例如,修改域或移除 cookie 所表示的用户)后从 Web 浏览器发送 cookie,那么 SSO 会失败并且用户会收到重新输入凭证信息的提示。请参阅针对 Liberty 使用 LTPA cookie 来定制 SSO 配置。
- 调试安全性公用 API。
- 装入 WSSecurityHelper 和 RegistryHelper,即使未启用安全性亦如此,例如,即使未指定安全性功能部件 - appSecurity-1.0、appSecurity-2.0 或 zosSecurity-1.0。如果未启用安全性,那么 WSSecurityHelper.isServerSecurityEnabled() 和 WSSecurityHelper.isGlobalSecurityEnabled() 方法都返回 false,而 RegistryHelper.getUserRegistry() 方法返回空值。
如果未启用安全性,那么可能不会装入其他安全性公用 API 类。如果尝试访问这些类,并调用其中一个类上的方法,那么您可能会收到 java.lang.NoClassDefFoundError 异常。
要避免收到 java.lang.NoClassDefFoundError 异常,必须先通过调用 WSSecurityHelper.isServerSecurityEnabled() 或 WSSecurityHelper.isGlobalSecurityEnabled() 类来测试以查看是否启用了安全性,然后只有在启用了安全性的情况下才调用其他安全性公用 API 类。有关此编码方法的示例,请参阅 Liberty:安全性公共 API。
- 注: 此行为与WebSphere Application Server 传统版不同。在WebSphere Application Server 传统版中,总是装入所有类,而无论是否启用了安全性。
- 无法认证使用 Unicode 字符的用户
- 如果要对名称中包含 Unicode 字符的用户进行认证,必须通过将以下 jvm 选项添加至服务器启动命令以将 Liberty 服务器使用的字符编码类型设置为 UTF-8:
-Dclient.encoding.override=UTF-8
还必须在登录页面中指定 charset 和 pageEncoding。以下是在登录 JSP 页面上指定这些参数的示例:<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- java.lang.annotation.AnnotationFormatError: java.lang.IllegalArgumentException:Wrong type at constant pool index at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:87)
- OpenID Connect 或 OAuth 提供者使用数据库存储器向某些版本的 JDK 7 注册客户机时,可能发生此错误。
为避免此问题,请升级至 JDK V7.1。
LDAP 故障诊断
此部分描述了一些常见 LDAP 问题以及您可以选择的解决方案。
- FFDC1015I: 已创建 FFDC 事件:javax.naming.ServiceUnavailableException:myldapserver.mycompany.com:636;套接字已关闭 com.ibm.ws.security.registry.ldap.internal.LdapRegistry 298
- messages.log 中的此消息指示无法访问所配置的 LDAP 服务器。请检查 LDAP 服务器以验证它是否处于运行状态,并验证它的 IP 地址是否可以从 Liberty 服务器进行访问。
- javax.naming.CommunicationException:简单绑定失败:myldapserver.mycompany.com:636 [根异常是 javax.net.ssl.SSLHandshakeException:com.ibm.jsse2.util.g:PKIX 路径构建失败:java.security.cert.CertPathBuilderException:找不到所请求目标的有效认证路径]
- 如果在 LDAP 服务器上启用 SSL,而未将 LDAP 服务器的签署者复制到 LDAPSSLSettings 元素中所引用的信任库,那么与 LDAP 服务器的连接会失败,且产生 SSL 握手错误。请确保将 LDAP 服务器的签署者复制到信任库。
- javax.naming.CommunicationException:myldapserver.mycompany.com:389 [根异常是 java.net.BindException:地址已在使用中:连接]
- 此消息可能出现在 FFDC 日志中,并指示本地服务器上的可用套接字已耗尽,这可能会导致无法连接至 LDAP 服务器。请确保套接字未使用,然后再试一次。
- CWWKS1100A: 用户标识 xxxxx 认证失败。指定的用户标识或密码无效
- 即使消息中提及的用户在高负载的 LDAP 服务器上是有效的,服务器上也可能会发生此 FFDC 异常。借助 LDAP 配置,您可以使用开发者工具来添加 reuseConnection=false 属性或者将其禁用。要修正问题,请将此属性设置为缺省值 true。
SSL 故障诊断
此部分描述了一些常见 SSL 问题以及您可以选择的解决方案。
- CWWKS9105E: 无法确定用于自动重定向的 SSL 端口。
- 如果您尝试访问的应用程序会重定向至 SSL 端口,但 SSL 端口不可用,那么会发生此错误。该端口可能会由于缺少 SSL 配置或 SSL 配置定义发生某些错误而不可用。请在 server.xml 文件中检查 SSL 配置,以确保它存在并且是正确的。请参阅保护与 Liberty 的通信。
- FFDC1015I: 在 ffdc_12.04.18_16.09.42.0.log 中创建了 FFDC 事件:“java.lang.IllegalArgumentException:配置未知、不完整:缺少标识字段 com.ibm.ws.config.internal.cm.ManagedServiceFactoryTracker aSyncReadNupdate。尝试读取配置并更新 ManagedServiceFactory 时抛出异常。异常 = java.lang.IllegalArgumentException:配置未知、不完整:缺少标识字段”
- 如果配置中存在不含标识字段的 keystore 元素,那么会发生此错误。如果使用最低 SSL 配置,请将标识字段设置为 defaultKeyStore。
- 如果使用启用了 SSL 的 LDAP 用户注册表,但未指定 sslRef 值,那么可能会收到异常。
- 例如,配置将 sslEnabled 设置为 true 但没有 sslRef 值,如以下示例中所示:
<ltldapRegistry id="ldap" realm="SampleLdapIDSRealm" host="ccwin12.austin.ibm.com" port="636" ignoreCase="true" baseDN="o=ibm,c=us" bindDN="cn=root" bindPassword="rootpwd" ldapType="IBM Tivoli Directory Server" idsFilters="ibm_dir_server" sslEnabled="true" searchTimeout="8m" />
必须输入 sslRef 值。如果使用的是类似如下的最低 SSL 配置:
sslRef 字段必须设置为 defaultSSLConfig。<ltkeyStore id="defaultKeyStore" location="key.jks" password="mypassword" />
如果已设定定制 SSL 配置,那么必须将该配置的名称放入 sslRef 字段中。
- 如果从 WebSphere Application Server 中使用 JDK,并且在 Liberty 服务器上启用了 SSL,那么您可能会见到以下错误。
java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory at javax.net.ssl.DefaultSSLSocketFactory.a(SSLSocketFactory.java:11) at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:6) at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:161) at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:36) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:390) at com.ibm.net.ssl.www2.protocol.https.b.getResponseCode(b.java:75) at com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection.loadJMXServerInfo(RESTMBeanServerConnection.java:142) at com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection.<init>(RESTMBeanServerConnection.java:114) at com.ibm.ws.jmx.connector.client.rest.internal.Connector.connect(Connector.java:315) at com.ibm.ws.jmx.connector.client.rest.internal.Connector.connect(Connector.java:103)
发生此错误是因为 Liberty 不支持 WebSphere Application Server SSL 套接字工厂。您可以通过执行下列步骤来解决此问题:- 创建带有以下两个空条目的文本文件(例如,my.java.security):
ssl.SocketFactory.provider= ssl.ServerSocketFactory.provider=
- 为 Liberty 服务器创建 jvm.options 文件
- 将以下属性添加至 jvm.options 文件,此属性包含指向您刚创建的文本文件的完整路径:
-Djava.security.properties=fullPathTo/my.java.security
- 如果要提高 my.java.security 文件的可复用性,请将此文件放在服务器目录中,然后您将能够使用类似如下的相对路径:
-Djava.security.properties=./my.java.security
有关更多信息,请参阅定制 Liberty 环境。
- 创建带有以下两个空条目的文本文件(例如,my.java.security):
对 CORBA/IIOP 进行故障诊断
本节描述了一些常见 CORBA 问题以及您可以选择的解决方案。
- 如果从 WebSphere Application Server 使用 JDK,那么应用程序使用 CORBA/IIOP 通信时您可能会见到以下错误。
15:21:58.096 com.ibm.rmi.pi.InterceptorManager runPreInit:178 Init Process ORBRas [default] java.lang.ClassNotFoundException: com.ibm.ISecurityLocalObjectBaseL13Impl.CSIClientRI at com.ibm.CORBA.iiop.UtilDelegateImpl.loadClass(UtilDelegateImpl.java:685) at javax.rmi.CORBA.Util.loadClass(Util.java:246) at com.ibm.rmi.pi.InterceptorManager.runPreInit(InterceptorManager.java:172) at com.ibm.rmi.corba.ORB.initializeInterceptors(ORB.java:664) at com.ibm.CORBA.iiop.ORB.initializeInterceptors(ORB.java:1084) at com.ibm.rmi.corba.ORB.orbParameters(ORB.java:1359) at com.ibm.rmi.corba.ORB.set_parameters(ORB.java:1271) at com.ibm.CORBA.iiop.ORB.set_parameters(ORB.java:1694) at org.omg.CORBA.ORB.init(ORB.java:371) ...
发生此错误是因为 Liberty 不支持 WebSphere Application Server 对象请求代理程序 (ORB) 拦截器。可通过从 JDK 编辑 orb.properties 文件以避免使用这些拦截器,从而解决此问题。此文件通常位于 WebSphere <JAVA_HOME>/jre/lib 目录中,尽管它可能已被用户的 <USER_HOME> 目录中的副本覆盖掉。以下示例显示 orb.properties 文件中必须注释掉的行:
# WS Interceptors #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.Transaction.JTS.TxInterceptorInitializer #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ejs.ras.RasContextSupport #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ISecurityLocalObjectBaseL13Impl.ClientRIWrapper #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.activity.remote.cos.ActivityServiceClientInterceptor #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ISecurityLocalObjectBaseL13Impl.CSIClientRI #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.debug.olt.ivbtrjrt.OLT_RI #org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.wlm.client.WLMClientInitializer # WS ORB & Plugins properties #com.ibm.ws.orb.transport.ConnectionInterceptorName=com.ibm.ISecurityLocalObjectBaseL13Impl.SecurityConnectionInterceptor
对日志记录和跟踪进行故障诊断
本节描述了有关日志记录和跟踪的一些常见问题。
- java.util.logging - Java 日志记录编程接口
- Liberty 不支持使用 logging.properties 文件配置 java.util.logging。使用 java 代码(例如,在部署的应用程序或用户功能部件中使用),来创建和添加 java.util.logging 处理程序、过滤器或格式化程序。
- 因为 Liberty 服务器根据日志记录配置元素的 traceSpecification 属性管理 java.util.logging 记录器级别,请避免使用 Logger.setLevel 方法。
对 JAX-WS 进行故障诊断
本节描述了一些常见 JAX-WS 问题以及您可以选择的解决方案。
- 在 Liberty 上部署 Web Service 应用程序时,发生 org.apache.cxf.bus.extension.ExtensionException。
- 如果应用程序中已嵌入 CXF 库和配置,并且您想要将该应用程序部署到 Liberty,那么必须确保通过从 server.xml 文件中移除 jaxws-2.2 服务器功能部件来禁用此功能部件。
- 将 IBM 快速路径与 Oracle JVM 一起运行时发生 java.lang.NoClassDefFoundError 异常。
- 要使用 IBM 快速路径 Java XML 绑定体系结构 (JAXB),可以配置 com.ibm.xml.xlxp.jaxb.opti.level 定制属性来控制是否对 JAXB 取消编组(反序列化)和编组(序列化)启用优化方法。如果您在将 IBM 快速路径 JAXB 与 Oracle JVM 一起运行时遇到 java.lang.NoClassDefFoundError 异常,那么可以将 com.ibm.xml.xlxp.jaxb.opti.level 属性的值更改为 0 以禁用优化。例如,您可以在命令行中使用 -Dcom.ibm.xml.xlxp.jaxb.opti.level=0 属性,或者向 jvm.options 文件中添加下面这一行:
# Turn off the JAXB optimization -Dcom.ibm.xml.xlxp.jaxb.opti.level=0
- 请在 Java 虚拟机定制属性页面上查看有关 com.ibm.xml.xlxp.jaxb.opti.level 属性的更多信息。
- 将 WebSphere Application Server 传统版瘦客户机与 Oracle JVM 配合运行时,发生 java.lang.NoClassDefFoundError : com.ibm.CORBA.iiop.ORB 异常。
- 尝试将 WebSphere Application Server 传统版 瘦客户机与 Oracle JVM 配合运行,并且 Liberty 中已经启用 jaxws-2.2 功能部件时,会发生此错误。要解决此问题,可以在运行
WebSphere Application Server 传统版
瘦客户机时使用
-Dcom.ibm.websphere.thinclient=true 属性,如下所示:
java -Dcom.ibm.websphere.thinclient=true -cp <classpath_entries_including_tWAS_thinclient_jar> <WebServicesClientEntryClass> <any_more_parameters>
- 请在 PM39777: ADMINISTRATIVE THIN CLIENT USING SOAP CONNECTOR AND SUN JDK DOES NOT WORK 页面上查看有关 com.ibm.websphere.thinclient 属性的类似信息。
- 将二进制文件从 MTOM 服务取回到 MTOM 客户机时返回空文件。
- 如果 MTOM 客户机已将二进制文件成功发送至 MTOM 服务,但是从 MTOM 服务取回这些二进制文件时返回空文件,就会发生这种情况。
- 作为一种变通方法,您可以创建新的 DataHandler,然后通过填充二进制文件的内容来初始化该 DataHandler。例如,使用 FileDataStore 对象从 I/O 进行读取,返回新创建的 DataHandler,然后将该 DataHandler 传递到其他 Web Service。
... File f = new File("received_image"); if (f.exists()) { connection.start(); } FileOutputStream fos = new FileOutputStream(f); img_in.writeTo(fos); FileDataSource fos_out = new FileDataSource(f); DataHandler img_out = new DataHandler(fos_out); return img_out; ...
- 将采用 xsd:gMonth 格式的 XMLGregorianCalendar 与 Oracle JVM 配合使用时发生了 javax.xml.ws.soap.SOAPFaultException:取消编组错误。
- 如果您使用 XMLGregorianCalendar 类将 gMonth 格式的常量作为客户端的 SOAP 请求的一部分来存储,并且在具有 Oracle JVM 的 Liberty 上启用了 jaxws-2.2 功能部件,就会发生此错误。造成此错误的根本原因是,对于 xsd:gMonth 类型,Oracle JVM 支持新的标准格式 --MM,而最新的 JAXB RI(参考实现)仅支持 --MM-- 格式。
- 要解决此问题,可以针对客户端应用程序和服务器端应用程序将 Oracle JVM 更改为 IBM JVM。
- 解析由 wsdlLocation 属性指定的 WSDL 文件时发生了 java.io.FileNotFoundException。
- 如果您像在 wsdlLocation = "file:/WEB-INF/wsdl/a.wsdl" 代码中一样指定 WSDL 文件,并且该 WSDL 文件打包在应用程序中,就会发生此错误。如果您想要引用打包在应用程序中的 WSDL 文件,那么必须对 @WebService、@WebServiceProvider、@WebServiceClient 或 @WebServieRef 注释中定义的 wsdlLocation 属性使用相对 URI。
- wsdlLocation 属性的相对 URI 必须为下列其中一个值:
- wsdlLocation = "/WEB-INF/wsdl/a.wsdl"
- wsdlLocation = "WEB-INF/wsdl/a.wsdl"
- messages.log 文件中出现大量“Creating service”消息。
- 当您调用所生成客户机存根类中的 getPort 或相关方法时,会发生这种情况。Liberty 配置为使用缺省日志记录配置,并且所有参考消息都写入 messages.log 文件。出现了大量消息,可能类似如下:
00000037 org.apache.cxf.service.factory.ReflectionServiceFactoryBean I Creating Service {http://www.echo.org/}EchoService from WSDL: wsjar:file:/wlp/usr/servers/default/workarea/org.eclipse.osgi/bundles/100/data/cache/ com.ibm.ws.app.manager_gen_15a42559-f979-4ee6-b488-9fa1fb212c96/.cache/Echo.war!/WEB-INF/wsdl/Echo.wsdl
- 要禁止这些参考消息,可以在 server.xml 文件中更改日志记录配置,如下所示:
<logging traceSpecification="org.apache.cxf.*=warning=enabled"/>
- SOAPFaultException:所给定的 SOAPAction test 与客户机应用程序发送 SOAP 操作时进行的操作不匹配。
- 注: test 是请求 HTTP 头中的 soapAction 属性的值。可以使 SOAP Web Service 中的每个操作与一个 SOAP 操作字符串相关联,例如在 WSDL 绑定中或者通过注释。Web Service 客户机将 SOAP 操作字符串作为头与请求一起发送,以与 Web Service 提供者的操作相匹配。在下列任一情况下将显示错误消息:
- 当客户机发送的 SOAP 操作与操作的 SOAP 操作不匹配时。
- 将 WebSphere Application Server 传统版用作 JAX-WS 客户机并将 Liberty 用作 JAX-WS 服务时,WSDL 文件中定义的 soapAction 等于空值 ""。
- 要解决此问题,请执行以下操作:
- 确保对 Web Service 客户机和 Web Service 提供者指定完全相同的 SOAP 操作。
- 对在 WSDL 文件中定义的 soapAction 属性提供有效值,或者在该 WSDL 文件中不使用 soapAction。
- 使用 Service.create() 方法来创建服务时,发生 javax.xml.ws.WebServiceException。
- 如果在未提供 WSDL 文档的情况下使用 Service.create() 方法来创建服务,那么会发生此错误。如果您想要使用 Service.create() 来创建服务以及使用 getPort() 方法来获取端口号,那么必须使用 addPort() 方法来提供绑定信息。
- 下面提供了样本示例代码,说明如何使用 addPort() 方法:
QName serviceName = new QName("http://test.com/wssvt/acme/InsBusiness/", "MTOM11Service"); QName portName = new QName("http://test.com/wssvt/acme/InsBusiness/", "MTOM11Port"); // Setup the necessary JAX-WS artifacts Service svc = Service.create(serviceName); // Add the port in the service instance svc.addPort(portName, SOAPBinding.SOAP11HTTP_MTOM_BINDING, mtom11URL); port = svc.getPort(portName, MTOMInterface.class);
- 如果 @WebResult 注释中的 name 属性与 WSDL 文档中的 name 元素不同,那么会返回 NULL 响应。
- 如果使用 SEI 类来定义 @WebResult 注释的 name 属性,并且 SEI 类已提供如下所示的 WSDL 位置,那么会发生此问题:
但是所提供 WSDL 文档中的 XML 元素声明如下所示:@WebService(wsdlLocation="WEB-INF/wsdl/WebServiceIfc.wsdl") public interface WebServiceRuntimeIfc { @WebMethod @WebResult(name="nononoreturn") public String echo (String parm); }
调用 echo() 方法时,Web Service 客户机将获取 NULL 响应。<xs:element name="echoResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
- 要解决此问题,请确保 @WebResult 注释的 name 属性与 WSDL 文档中 name 元素的值匹配。
- JAX-WS 客户机应用程序无法从服务器端获取 WSDL 文档更改。
- 如果 Web Service 客户机和 Web Service 提供者位于 Liberty 上的两个不同应用程序中,并且客户机需要动态地从 Web Service 提供者检索 WSDL 文档,那么会发生此问题。这是因为首次访问 WSDL 文档时 Liberty 会缓存 WSDL 定义,此行为与 WebSphere Application Server 传统版中的行为不同。通过在 Liberty 中缓存 WSDL 定义,应用程序可以避免频繁地连接和解析 WSDL 文档。
- 要解决此问题,必须重新启动客户机应用程序,以便能重新装入已更新的 WSDL 定义。
- WSDL 导入期间生成 JAXB 警告
- 在导入 WSDL 文件时可能会遇到以下警告消息。
[WARNING] 未知的可扩展性元素或属性“wsdl”(在名称空间“http://www.w3.org/2000/xmlns/”(http://www.w3.org/2000/xmlns/%27) 中)
对 WS-Security 进行故障诊断
- 请检查 server.xml 文件以确保正确配置了必需的 JAX-WS (jaxws-2.2) 功能部件和安全性 (appSecurity-2.0) 功能部件。
- 要使用 WS-Security 来保护 Web Service 应用程序,JAX-WS 应用程序必须包含一个具有嵌入式 WS-Security 策略的 WSDL 文件。在 wsdl:binding 和/或 wsdl:operation 部分,必须存在对于该嵌入式 WS-Security 策略的 PolicyReference。
- 如果您使用回调处理程序来检索密码以生成 UsernameToken,或者用于从密钥库文件中检索专用密钥的密码,那么必须将密码回调处理程序作为 Liberty 中的用户功能部件进行打包和部署。
启用 WS-Security 跟踪
如果根据错误消息中的信息无法确定发生此问题的原因,那么可以使用 Liberty 的跟踪和日志记录工具来收集对于 WS-Security 组件的跟踪。请参阅 Liberty:跟踪和日志记录。
org.apache.ws.security.*=all=enabled:
org.apache.cxf.ws.security.*=all=enabled:
org.apache.cxf.ws.policy.*=all=enabled
org.apache.xml.security.*=all=enabled:
com.ibm.ws.wssecurity.*=all=enabled
本节描述了一些常见 WS-Security 问题以及您可以选择的解决方案。
- org.apache.cxf.ws.policy.PolicyException:不能满足任何替代策略。
- 当 server.xml 文件中未定义 WS-Security 功能部件 wsSecurity-1.1 时,通常会发生此错误。为了避免发生此错误,您必须在 server.xml 文件中按如下所示定义 wsSecurity-1.1 功能部件:
<featureManager> <feature>usr:wsseccbh-1.0</feature> <feature>servlet-3.0</feature> <feature>appSecurity-2.0</feature> <feature>jaxws-2.2</feature> <feature>wsSecurity-1.1</feature> </featureManager>
- org.apache.cxf.ws.policy.PolicyException:不存在回调处理程序,没有密码可用。
- 如果 WS-Security 运行时无法检索在生成 UsernameToken 时所需要的密码,或者无法访问密钥库中的专用密钥,就会发生此错误。为了避免发生此错误,请检查以下配置:
- 请确保密码回调处理程序功能部件 wsseccbh-1.0 在 server.xml 文件中定义为用户功能部件:
<featureManager> <feature>usr:wsseccbh-1.0</feature> <feature>servlet-3.0</feature> <feature>appSecurity-2.0</feature> <feature>jaxws-2.2</feature> <feature>wsSecurity-1.1</feature> </featureManager>
- 请确保在 server.xml 文件的 <wsSecurityClient> 或 <wsSecurityProvider> 元素中定义了回调处理程序属性 ws-security.callback-handler:
ws-security.callback-handler="<full class name of the callback handler>" example: ws-security.callback-handler="com.ibm.ws.wssecurity.example.cbh.CommonPasswordCallback"
- 请确保密码回调处理程序返回了在 server.xml 文件中指定的用户名或密钥别名的正确密码。该密码必须为明文,并且未编码,也未加密。
- 请确保密码回调处理程序功能部件 wsseccbh-1.0 在 server.xml 文件中定义为用户功能部件:
- org.apache.ws.security.WSSecurityException:签名未涵盖必需的元素 (soap:Body)。
- 如果 Web Service 提供程序应用程序期望指定请求消息中的 SOAP 主体,但是接收到的 SOAP 消息未指定 SOAP 主体,就会发生此错误。为了避免发生此错误,请确保为 Web Service 客户机所配置的正确 WS-Security 策略与 Web Service 提供者的策略相匹配。
- org.apache.ws.security.WSSecurityException:签名或解密无效。
- 如果 WS-Security 运行时未能验证签名或者将接收到的 SOAP 消息中已加密的消息部件解密,就会发生此错误。为了避免发生此错误,请验证您在 server.xml 文件的 <wsSecurityClient> 和 <wsSecurityProvider> 元素中配置 WS-Security 时使用了正确的密钥。如果 Web Service 客户机使用 Bob 的公用密钥对消息部件进行加密,那么 Web Service 提供者必须对 Bob 的专用密钥具有访问权才能对该消息解密。同样,如果 Web Service 客户机使用 Alice 的专用密钥为消息部件签名,那么该 Web Service 提供者必须使用 Alice 的公用密钥来验证该签名。
- org.apache.cxf.ws.policy.PolicyException:无法满足这些替代策略。
- 如果 WS-Security 运行时无法使用所配置的用来处理此请求的 WS-Security 策略来成功处理入局 SOAP 消息,就会发生此错误。为了避免发生此错误,请查看紧跟着此异常的消息,以确定导致此异常的特定 WS-Security 策略断言。例如,日志文件中可能包含下列消息:
在这种情况下,因为 Web Service 客户机所使用的加密算法与 AlgorithmSuite 断言所指定的加密算法不匹配,所以发生了错误。在 Web Service 客户机和 Web Service 提供程序的 WS-Security 策略中指定的算法套件必须指定同一加密算法。Caused by: org.apache.cxf.ws.policy.PolicyException: These policy alternatives can not be satisfied: {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding: The encryption algorithm does not match the requirement {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}InitiatorEncryptionToken {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}RecipientEncryptionToken at org.apache.cxf.ws.policy.AssertionInfoMap.checkEffectivePolicy(AssertionInfoMap.java:167) at org.apache.cxf.ws.policy.PolicyVerificationInInterceptor.handle(PolicyVerificationInInterceptor.java:101)
- javax.xml.ws.soap.SOAPFaultException:消息已到期(WSSecurityEngine:时间戳记无效。消息的安全性语义已到期)。
- 如果消息时间戳记已到期,或者使用将来的时间戳记创建了消息,就会发生此错误。


将修订包和临时修订套用到归档安装
如果您从归档文件(而不是使用 Installation Manager)安装 Liberty 运行时环境,那么在应用服务更新时必须采取特别措施。有关更多信息,请参阅将修订包应用于 Liberty Java 归档安装和将临时修订应用于 Liberty 归档安装。
诊断性能
本部分描述了一些常见性能问题以及您可以选择的解决方案。
- 应用程序监视器产生高 CPU 使用率。
如果应用程序监视器在 apps/ 目录下具有很多文件,且过度频繁地进行轮询,那么会发生此错误。
要避免此问题,可以更改一些设置。
- 增大 applicationMonitor 元素中 pollingRate 属性的值。
- 更新 server.xml 以将 applicationMonitor 元素包含在不是 polled 的 updateTrigger 中。
server.xml <applicationMonitor updateTrigger="mbean" />
- 减少 apps/ 目录下的文件数。
有关 applicationMonitor 元素的更多信息,请参阅控制动态更新。
对集合体进行故障诊断
此部分描述集合体具有的问题以及您必须应用的解决方案。
- java.lang.IllegalArgumentException: CWWKX0219E: MBean“WebSphere:feature=collectiveController,type=CollectiveRepository,name=CollectiveRepository”没有名为“retrieveMemberRootCertificate”的操作
- 具有功能部件 collectiveMember-1.0(成员)的服务器无法向具有处于更低 Liberty 级别的功能部件
collectiveController-1.0(控制器)的服务器注册。例如,处于此 Liberty Beta 级别的成员无法向
V8.5.5.2 Liberty 中的控制器注册自身。
使用缺省日志记录时,成员的 FFDC 日志中会将此问题报告为首次故障数据捕获 (FFDC)。
要解决此问题,您必须将控制器移到等于或高于成员所处的 Liberty 级别。
对 SAML 进行故障诊断
此部分描述 SAML 具有的问题以及您必须应用的解决方案。
- java.lang.ArrayIndexOutOfBoundsException: 数组下标超出范围:0
- 尝试通过非请求式的服务供应商 (SP) 发起的请求多次登录而不移除身份提供者令牌 (IdP)时,可能发生此异常。
- 为避免此问题,请在相关的来路不明的 server.xml 文件中添加 <httpSession invalidateOnUnauthorizedSessionRequestException="true" />。
- java.lang.IllegalStateException: CWWKS0010E: 获取调用者主体时,发现调用者主体集具有类型为 WSPrincipal 的多个主体。该主体集中只能有一个 WSPrincipal。WSPrincipal 的名称为:{0}
- 如果 SAML 用户先前直接登录本地用户注册表,那么可能发生此异常。为避免此问题,SAML 用户不得直接登录本地用户注册表。
对 REST API 发现进行故障诊断
如果远程调用 IBM REST API 文档资源管理器“试用”选项,且调用失败,返回响应代码 0,请确保向 IBM REST API 发现资源管理器中与 GET、PUT、POST 或 DELETE 操作关联的 Curl 和请求 URL 返回标准主机名或 IP 地址。如果标准主机名或 IP 地址不在 Curl 和请求 URL 中,请完成以下操作:
- 在 server.xml 中添加变量元素,并指定标准主机名。以下是在 server.xml 文件中添加用于指定标准主机名的变量元素:
<httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/> <variable name="defaultHostName" value="developer.rtp.raleigh.ibm.com"/>
将操作系统的完整计算机名称指定为标准主机名。
- 验证是否在 IBM REST API 发现资源管理器中与 GET、PUT、POST 或 DELETE 操作关联的 Curl 和请求 URL 中返回标准主机名。有关更多信息,请参阅设置 Liberty 服务器的缺省主机名,并阅读 IBM InfoSphere Information Server V11.3.1 产品文档中有关配置网络的信息。