Sugerencias para la resolución de problemas de las herramientas de línea de mandatos de los servicios web

Utilice estas sugerencias para solucionar problemas de las herramientas de la línea de mandatos WSDL2Java y Java2WSDL que se utilizan al desarrollar servicios web JAX-RPC (Java™ API for XML-based RPC - API de Java para RPC basado en XML).

Cada sección de este tema muestra un problema que puede encontrar al utilizar la herramienta WSDL2Java o Java2WSDL. Se proporciona una solución para ayudarle a resolver el problema.

[z/OS]Las herramientas de línea de mandatos WSDL2Java y Java2WSDL no están soportadas en la plataforma z/OS. Esta funcionalidad la proporcionan las herramientas de ensamblaje suministradas con WebSphere Application Server ejecutándose en la plataforma z/OS. Consulte la documentación sobre las herramientas de línea de mandatos WSDL2Java y Java2WSDL para aplicaciones JAX-RPC (API Java para llamadas a procedimiento remoto XML) para obtener más información sobre estas herramientas.

El cliente .Net no refleja un método de servicio web con los parámetros de tipo vector. Se visualiza la siguiente excepción al ejecutar el cliente .NET para un servicio web:
System.InvalidOperationException: el método AnnuityInteropService.wsListAnnuityByHolder no se puede reflejar.
System.InvalidOperationException: Se ha producido un error al reflejar wsListAnnuityByHolderResult.
System.InvalidOperationException: La propiedad Form no puede estar sin calificar cuando hay una propiedad de espacio de nombres explícita disponible.   

El problema queda expuesto cuando el método del extremo del servidor devuelve un vector y el estilo del archivo WSDL (Web Services Description Language) es de documento/literal y Form no está calificado. De forma predeterminada, se genera Form sin calificar para el estilo de documento/literal debido a que elementFormDefault="unqualified".

Existe un problema en la infraestructura .NET que puede generar una clase de proxy de servicio web que no es válida cuando los métodos de servicios web contienen determinadas matrices como parámetros. La infraestructura añade un atributo XmlArrayAttribute al parámetro y el constructor del atributo contiene "Form=Unqualified" y una definición de espacio de nombres. Aunque el atributo es válido, no es válido combinar estos dos aspectos del atributo porque se genera la excepción System.InvalidOperationException.

Para evitar este problema, no utilice los parámetros de Vector en un método de servicio web que se despliegue en WebSphere Application Server. Los parámetros de vector en un método de servicio web no funcionan con un cliente .Net o un tipo de colección Java.

Cuando ejecuta la herramienta Habilitador de punto final en una máquina habilitada para hiperhebras, se genera un error en la vista Tareas para el proyecto de aplicación de empresa. El proyecto de aplicación de empresa no se puede suprimir hasta que reinicia el área de trabajo.

Este problema se puede producir si existe una condición de competencia entre la creación automática y el validador de proyectos EJB (Enterprise JavaBeans).

Para resolver el problema, desactive la creación automática del área de trabajo antes de ejecutar la herramienta Habilitador de punto final y vuelva a activarla después.

Se producen errores de validación de la especificación JRS (Java Specification Requests) 109 al desplegar un archivo EAR (Enterprise Archive) que contenga un archivo WSDL con enlaces http, jms y ejb generados por la herramienta de línea de mandatos Java2WSDL.

La especificación JSR 109 requiere que cada componente de puerto definido en el archivo de descriptor de despliegue webservices.xml haga referencia a los elementos exclusivos <servlet-class> del archivo web.xml para una implementación de JavaBeans, o un elemento <session> exclusivo en el archivo ejb-jar.xml para una implementación de EJB. El servlet y el EJB de sesión se encuentran en el archivo webservices.xml representado por el elemento <servlet-link> o <ejb-link>.

La herramienta de línea de mandatos WSDL2Java correlaciona los puertos encontrados en un archivo WSDL con los componentes de puerto en el archivo webservices.xml generado. Si un solo servicio web tiene varios enlaces, además de un puerto para cada uno de estos enlaces, el archivo webservices.xml contiene varios componentes de puerto todos los cuales deben apuntar a la misma implementación de módulo EJB (<session>) o de JavaBeans (<servlet-class>). A causa de las restricciones JSR 109, el archivo webservices.xml no es válido y se pueden producir errores durante el proceso de despliegue.

En el siguiente ejemplo se muestra el error:
Error en <módulo> : CHKW6030E: Clase de implementación <clase> referenciada por los componentes de puerto 
<port1> y <port2>. (JSR109 1.0: 7.1.2).	
Éste es el error con datos de ejemplo:
Error en WebSvcsInSession20EJB.jar : CHKW6030E: Clase
de implementación WSMultiProtocol referenciada por los 
componentes de puerto WSMultiProtocolJMS y WSMultiProtocolEJB. (JSR109 1.0: 7.1.2).	

Puede eludir la restricción creando varias definiciones EJB de <sesión> en el archivo ejb-jar.xml que apunten, todas ellas, a la misma clase de implementación, interfaz de inicio e interfaz remota. Aún puede utilizar las mismas clases, pero las definiciones de <sesión> del archivo ejb-jar.xml que hacen referencia a las clases e interfaces deben duplicarse.

A continuación se muestra un ejemplo del archivo webservices.xml. Busque las clases y las interfaces:
<webservices>
  <webservice-description>
    <webservice-description-name>WSMultiProtocolService</webservice-description-name>
    <wsdl-file>META-INF/wsdl/WSMultiProtocol.wsdl</wsdl-file>
    <jaxrpc-mapping file>META-INF/WSMultiProtocol_mapping.xml</jaxrpc-mapping file>
    <port-component>
      <port-component-name>WSMultiProtocolEjb</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolEjb</localpart>
      </wsdl-port>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
			</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol</ejb-link>
      </service-impl-bean>
    </port-component>
    <port-component>
				<port-component-name>WSMultiProtocolJMS</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolJMS</localpart>
      </wsdlport>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
			</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol_2</ejb-link>
      </service-impl_bean>
		</port-component>
        <port-component>
       				<port-component-name>WSMultiProtocolJMS</port-component-name>
      <wsdl-port>
        <namespaceURI>http://ejb.pli.tc.wssvt.ibm.com</namespaceURI>
        <localpart>WSMultiProtocolJMS</localpart>
      </wsdlport>
      <service-endpoint-interface>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol
			</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>WSMultiProtocol_3</ejb-link>
      </service-impl_bean>
		</port-component>
	</webservice-description>
</webservices>
A continuación se muestra un ejemplo del archivo ejb-jar.xml. Busque las clases y las interfaces y cómo están duplicadas:
<ejb-jar-id="ejb-jar_ID">
		<display-name>WebSvcsInsSession20EJB</display-name>
	<enterprise-beans>
				<session-id="WSMultiProtocol">
						<ejb-name>WSMultiProtocol</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586720">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
			</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
			</ejb-ref>
		
		
				<session-id="WSMultiProtocol_2">
						<ejb-name>WSMultiProtocol_2</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586720_2">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
			</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790_2">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
			</ejb-ref>
		
		
				<session-id="WSMultiProtocol_3">
						<ejb-name>WSMultiProtocol_3</ejb-name>
						<home>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolHome</home>
						<remote>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocol</remote>
						<ejb-class>com.ibm.wssvt.tc.pli.ejb.WSMultiProtocolWebSvcsBean</ejb-class>
						<session-type>Stateless</session-type>
						<transaction-type>Container</transaction-type>
						<ejb-ref-id="EjbRef_1082407586790_3">
				<description></description>
								<ejb-ref-name>ejb/BeneficiarySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.BeneficiarySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.BeneficiarySession</remote>
								<ejb-link>PolicySession20EJB.jar#BeneficiarySession</ejb-link>
			</ejb-ref>
						<ejb-ref-id="EjbRef_1082407586790_3">
				<description></description>
								<ejb-ref-name>ejb/PolicySession</ejb-ref-name>
								<ejb-ref-type>Session</ejb-ref-type>
								<home>com.ibm.wssvt.tc.pli.ejb.PolicySessionHome</home>
								<remote>com.ibm.wssvt.tc.pli.ejb.PolicySession</remote>
								<ejb-link>PolicySession20EJB.jar#PolicySession</ejb-link>
			</ejb-ref>
		</session>

Si una aplicación utiliza funciones proporcionadas por un determinado arreglo que se elimina posteriormente, la aplicación muestra un mensaje de error. Si elimina un arreglo, asegúrese de volver a probar las aplicaciones para comprobar si hay errores. Vuelva a desplegar cualquier aplicación que muestre mensaje de error debido a la falta de un arreglo.

Por ejemplo, suponga que instala un fixpack en WebSphere Application Server y crea el servicio web de cotización en bolsa StockQuote. La herramienta de línea de mandatos WSDL2Java se utiliza en un rol de desplegador y genera una clase ServiceLocator que amplía la clase AgnosticService.

Si desinstala el fixpack, la aplicación utiliza una nueva clase de servicios web (AgnosticService) que la versión de WebSphere Application Server no soporta. La aplicación crea el error siguiente:
java.lang.NoClassDefFoundError:
		Error al definir la clase:
	com.ibm.ws.wsfvt.test.stockquote.StockQuoteServiceLocator
		Este error indica que la clase:
	com.ibm.webservices.multiprotocol.AgnosticService
		no se ha podido localizar al definir la clase:
	com.ibm.ws.wsfvt.test.stockquote.StockQuoteServiceLocator 																														
Necesita volver a desplegar la aplicación en WebSphere Application Server para emitir código que no utilice la versión de WebSphere Application Server no soportada por la clase de servicios web que se utilizan.

Si utiliza un entorno que requiere un servidor proxy para acceder a Internet durante la ejecución del mandato WSDL2Java, es posible que el mandato WSDL2Java no encuentre la información de Internet, dado que el servidor proxy puede exceder el tiempo de espera. Por ejemplo, si el archivo WSDL de entrada está ubicado en Internet en lugar de en una unidad local y tiene que recuperarlo de Internet, el mandato WSDL2Java no podrá encontrarlo porque el servidor proxy excede el tiempo de espera.

[AIX Solaris HP-UX Linux Windows][z/OS]Puede solucionar este problema editando el archivo WSDL2Java.bat si utiliza el sistema operativo Windows o el archivo WSDL2Java.sh si utiliza el sistema operativo Linux o AIX. Estos archivos se encuentran en el directorio <raíz_instalación>/WebSphere/AppServer/bin.

[Windows][z/OS]Si utiliza el sistema operativo Windows, establezca los valores del host proxy y del puerto en el archivo WSDL2Java.bat como se indica a continuación:
PROXY_INFO="-Dproxy.httpHost=suSistPrpalProxy -Dproxy.httpPort=suPuertoProxy
[Linux][AIX][HP-UX][Solaris][z/OS]Si utiliza el sistema operativo Linux o AIX, establezca los valores del host proxy y del puerto en el archivo WSDL2Java.sh como se indica a continuación:
PROXY_INFO="-Dproxy.httpHost=suSistPrpalProxy -Dproxy.httpPort=suPuertoProxy
[IBM i]Puede solucionar este problema editando el mandato WSDL2Java que se encuentra en el directorio raíz_servidor_aplicaciones/bin. Establezca el valor del host proxy y del puerto del modo siguiente:
  • Edite el archivo raíz_perfil/bin/WSDL2Java y añada la línea siguiente al principio del archivo:
    export PROXY_INFO="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort"
    Si utiliza esta opción, se debe invocar el mandato WSDL2Java, localizado en el directorio raíz_perfil/bin.
  • Establezca la variable de entorno PROXY_INFO en la sesión Qshell antes de invocar el mandato WSDL2Java como se indica a continuación:
    $ export PROXY_INFO ="-Dproxy.httpHost=yourProxyHost -Dproxy.httpPort=yourProxyPort" 
    Si utiliza esta opción, debe ejecutar el mandato cada vez que se inicia una sesión QSHELL nueva. Si no desea iniciar una sesión QSHELL cada vez, puede añadir el mandato al perfil.

[AIX Solaris HP-UX Linux Windows][z/OS]Si ejecuta la herramienta de línea de mandatos WSDL2Java en un documento WSDL que contiene una dirección web de punto final de estilo JMS, por ejemplo, jms:/..., el archivo urlprotocols.jar que contiene el manejador de protocolo personalizado para el protocolo JMS debe estar en la declaración de variable CLASSPATH. El error WSWS3099E: Error: Error de emisor. Se evita la dirección de punto final no válida del puerto <x> en el servicio <y>: <jms-url-string> asegurándose de que el archivo urlprotocols.jar está en la sentencia de la variable CLASSPATH.

[AIX Solaris HP-UX Linux Windows][z/OS]Para añadir el archivo urlprotocols.jar a la declaración de variable CLASSPATH:

[Windows][z/OS]En plataformas Windows, edite el archivo raíz_instalación\bin\setupCmdLine.bat y localice la línea que establece la variable de entorno WAS_CLASSPATH. Añada %raíz_instalación%\lib\urlprotocols.jar al final de la línea que establece la variable de entorno WAS_CLASSPATH.

[Linux][AIX][z/OS][Solaris][HP-UX]En sistemas operativos Linux, AIX, HP-UX y Solaris, edite el archivo raíz_instalación/bin/setupCmdLine.sh y añada $raíz_instalación/lib/urlprotocols.jar al final de la línea que establece la variable de entorno WAS_CLASSPATH.

[AIX Solaris HP-UX Linux Windows][z/OS]Asegúrese de utilizar el carácter delimitador adecuado para la plataforma. Por ejemplo, utilice un punto y coma (;) para las plataformas de Windows y dos puntos (:) para los sistemas operativos Linux, AIX, HP-UX y Solaris.


Icon that indicates the type of topic Reference topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwbs_trbcommand
File name: rwbs_trbcommand.html