InvocationTargetException

Soy nuevo en esto de Web Services con Axis. He desarrollado en Eclipse y con ayuda de algunas tareas ANT un Web Service, tanto servidor como cliente. El servidor lo tengo sobre un OC4J y está accesible, ya que lo he probado a través de un navegador Web accediendo a la URL del fichero wsdl. Sin embargo cuando intento invocar a alguno de los métodos del Web Service desde el cliente me salta una excepción como la que sigue:
java. Lang. Reflect. InvocationTargetException
    at org. Apache. Axis. Message. SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
    at org. Apache. Axis. Message. SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
    at org. Apache. Axis. Encoding. DeserializationContext. EndElement(DeserializationContext.java:1087)
    At oracle.xml.parser.v2.NonValidatingParser.parseElement(NonValidatingParser.java:1318)
    At oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:336)
    At oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:303)
    At oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:206)
    At oracle.xml.jaxp.JXSAXParser.parse(JXSAXParser.java:292)
    at org. Apache. Axis. Encoding. DeserializationContext.parse(DeserializationContext.java:227)
    at org. Apache. Axis. SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org. Apache. Axis. Message.getSOAPEnvelope(Message.java:435)
    at org. Apache. Axis. Handlers. Soap. MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
    at org. Apache. Axis. Client. AxisClient.invoke(AxisClient.java:206)
    at org. Apache. Axis. Client.Call.invokeEngine(Call.java:2784)
    at org. Apache. Axis. Client.Call.invoke(Call.java:2767)
    at org. Apache. Axis. Client.Call.invoke(Call.java:2443)
    at org. Apache. Axis. Client.Call.invoke(Call.java:2366)
    at org. Apache. Axis. Client.Call.invoke(Call.java:1812)
    At com.tsol.tramita.gescon.ws.client.TramitaHttpBindingStub.altaDocumento(TramitaHttpBindingStub.java:120)
    At com.tsol.tramita.gescon.api.TramitaWSDelegate.altaDocumento(TramitaWSDelegate.java:61)
    At com.tsol.tramita.gescon.amain.TramitaTest.main(TramitaTest.java:21)
Me gustaría saber por qué puede deberse este error y si me puedes ayudar a solucionarlo.

4 Respuestas

Respuesta
1
¿Has puesto los jars de Axis en el directorio de librerías de OC4J?
Sí, después de cambiar las excepciones que capturaba, decidí capturar Throwable y el error viene de no encontrar una clase. El tema es que mi proyecto se debe "empotrar" como jar dentro de otro y a su vez tiene que utilizar clases de éste. Sin embargo, al desarrollar le pongo una referencia a dicho proyecto para que coja las clases, pero aún así no las encuentra. Ahora estoy intentando solucionar este problema, aunque no sé muy bien como hacerlo.
Saludos!
¿Estás usando la misma versión de Axis para el cliente y para el servidor? A veces he tenido problemas con Axis por usar versiones diferentes. En cuanto a lo de "empotrar" no termino de entenderlo. Si haces una librería que se use desde otro proyecto y tienes que usar las clases de ese proyecto desde la librería, ¿no sería mejor sacar del proyecto aquello que sea común a tu librería y tener 2 librerías y el otro proyecto? Lo siento no termino de entender la funcionalidad de esto último. Por último entiendo que el error que estás teniendo es en la librería al usar el cliente, ¿es así?
El tema es que el cliente quiere que el Web Service que estoy desarrollando forme parte de la otra aplicación siendo incluida como jar. La otra aplicación es bastante gorda y no debe ser tocada ya que está desarrollada por otras personas y no debe ser modificada.
El problema está al realizar la llamada desde el cliente. La llamada al Web Service la hace, pero en la implementación del WebService se requieren, como te he comentado antes, clases de la aplicación principal. Entonces, ahí es cuando me da la excepción:
oracle.classloader.util.AnnotatedNoClassDefFoundError:
          Falta la clase: com.tsol.tramita.modulos.expedientes.manager.Expedientes
        Clase Dependiente: com.tsol.tramita.gescon.webservice.TramitaHttpBindingImpl
                 Cargador: trewa:1.0
            Origen de Código: /home/sigem/oc4j_tramita/j2ee/home/shared-lib/trewa/1.0/TramitaGPService.jar
          Configuración: <code-source> in /home/sigem/oc4j_tramita/j2ee/home/config/server.xml
Gracias por su atención!
Saludos!
Ok. Entonces el problema que tienes es que tienes que incluir los jar de la aplicación como parte del proyecto que estás desarrollando para que te funcione. ¿Has probado eso? Es que estás creando una referencia cíclica entre la aplicación y tu proyecto y eso es complicado de resolver.
Respuesta
1
Con sólo esa traza es complicado saber donde puede estar el error. ¿Da la misma excepción para todos los métodos del Web Service?
Necesitaría ver la definición de los métodos y qué valores se les está pasando.
Hola!
La excepción me da para todos los métodos del WebService. Por parte del servidor la definición de los métodos es:
public long altaDocumento(long tipoDocumento, long codDocumento, long unidadAdministrativa) throws java.rmi.RemoteException {
TramitaWS tramita = new TramitaWS();
return tramita.altaDocumento(tipoDocumento, codDocumento, unidadAdministrativa);
}
public long borrarDocumento(long tipoDocumento, long codDocumento) throws java.rmi.RemoteException {
TramitaWS tramita = new TramitaWS();
return tramita.borrarDocumento(tipoDocumento, codDocumento);
}
public long cambiaEstadoDocumento(long tipoDocumento, long codDocumento, long l, long l1, java.lang.String s, long l2, long l3, java.lang.String s1, java.util.Date date, java.lang.String s2) throws java.rmi.RemoteException {
TramitaWS tramita = new TramitaWS();
return tramita.cambiaEstadoDocumento(tipoDocumento, codDocumento, l, l1, s, l2, l3, s1, date, s2);
}
Desde el cliente realizo la invocación a estos métodos a través de:
public static long callWebServiceAlta(long tipoDocumento,long codDocumento,long unidadAdministrativa){try{
ResourceBundle props = ResourceBundle.getBundle(PROPIEDADES);
String WSURL = props.getString("URL");
long ini = System.currentTimeMillis();
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(WSURL);
call.setOperationName(new QName("urn:TramitaGPService", "altaDocumento"));
QName QNdoc = new QName("urn:TramitaGPService", "long");
QName QNcod_doc = new QName("urn:TramitaGPService", "long");
QName QNunid = new QName("urn:TramitaGPService", "long");
QName qnameret = new QName("urn:TramitaGPService", "Object");
call.addParameter("tipoDocumento", QNdoc, ParameterMode.IN);
call.addParameter("codDocumento", QNcod_doc, ParameterMode.IN);
call.addParameter("unidadAdministrativa", QNunid, ParameterMode.IN);
call.setReturnType(qnameret);
call.invoke(new Object[] {tipoDocumento,codDocumento,unidadAdministrativa});
Los valores que le paso a esta clase lo hago desde una clase Main dando los valores 10, 7015, 163 respectivamente.
Gracias!
Saludos!
La verdad es que nunca he usado OC4J y suelo hacer Web Services de otra manera. De ahí parece más o menos todo correcto. Sólo algún detalle raro veo:
QName qnameret = new QName("urn:TramitaGPService", "Object");
Por qué un object de retorno cuando los metodos devuelven todos un long?
call.invoke(new Object[] {tipoDocumento,codDocumento,unidadAdministrativa});
Por qué un array de Object?
El qnameret está modificado en mi código, sí que tengo puesto long. El array de objetos es porque lo había tomado similar a otro Web Service, pero claro en ese caso los parámetros no eran todos long.
Con ello cambiado, me sigue pasando lo mismo, ahora tengo puesto en el caso de los 2 Object que veías antes un long.
He hecho un debug y al servidor llega, de hecho tengo un breakpoint en la línea en negrita y cursiva. Pero en el momento que intento acceder al contenido del método (F5, hago debug desde Eclipse) me salta la excepción y no me lleva a ninguna clase. No sé la verdad que estoy probando mil cosas y estoy un poco desesperado...
public long altaDocumento(long tipoDocumento, long codDocumento, long unidadAdministrativa){
try{
long respuesta = com.tsol.tramita.gescon.ws.TramitaWSImpl.altaDocumento(tipoDocumento, codDocumento, unidadAdministrativa);
return respuesta;
}catch(Exception e){
e.printStackTrace();
return 1;
}
}
Muchas gracias por tu atención!
Saludos!
Lo siento pero con pedazos de información no soy capaz de ver donde puede estar el problema. Los web services son difíciles de implementar y de configurar bien. Ese tipo de excepciones tan genéricas suelen ser problema de la arquitectura o mal diseño de los web services, no de un bug en el código. Por desgracia no he hecho nada en OC4J para poder intuir cual es el problema.
Debes coger un ejemplo ya hecho, como decías, y hacer que te funcione. A partir de ahí ir modificándolo para que se adapte a tu caso
Ok! Gracias!
De todas formas he conseguido llegar a algo más y en vez de capturar una Exception capturo el throwable. En él me dice que la excepción tan general de la que hablamos es porque no encuentra una clase que la referencio desde un import en mi servicio. La clase pertenece a otro proyecto que referencio desde el mío. Concretamente lo que yo esto desarrollando va a ir dentro del otro proyecto como un .jar. Entonces este jar requiere utilizar alguna de las clases del otro proyecto y al parecer no las está encontrando... Lo que no se muy bien es como poner ese import para que me encuentra la susodicha clase...
Muchas gracias!
Ah, mira tú...
Pues ese problema sí que es típico. Cuando desarrollas en eclipse una aplicación, se suele cometer el error de creer que no hay ningún error de importaciones porque no da ningún error de compilación. Y eso es así porque eclipse es muy listo encontrando las cosas, sobre todo porque tú le dices que use otro proyecto de eclipse para encontrarlas. Pero cuando esa aplicación se sube a un servidor (incluso dentro de eclipse), ya no las encuentra tan fácil. Si vas a incluir otro proyecto como jar, debes crear el jar y meterlo en el proyecto y empezar a importar de ese jar. Además quitar la referencia al otro proyecto porque no te beneficia a la hora de la verdad.
Mmm, el proyecto que tengo que incluir como jar es el mío en el otro. El tema es que desde el mío tengo que hacer referencia a clases del otro proyecto. Digamos que tengo que hacer un nuevo Web Service para una aplicación. Entonces, el cliente pide que este nuevo Web Service se incluya como un jar dentro de la otra aplicación. Por tanto, si quito las referencias al proyecto no me va a encontrar las clases... ¿Según la solución que me propones sería dejar mi proyecto como tal quitando la referencia e incluirlo como jar dentro del otro posibilitando que encuentre dichas clases?
Esa es la mejor solución para resolver los problemas de importación. La referencia de proyectos solo es útil en eclipse mientras se está desarrollando. Porque si después el proyecto se va a convertir en un war o jar, ya no podrá encontrar el otro proyecto por sí mismo sin la ayuda de eclipse. Puedes ir desarrollando en tu proyecto y según hagas cambios generar un nuevo jar para que el otro proyecto lo use.
No se si me explico pero el problema es que es el eclipse el que hace que 2 proyectos puedan usar las clases entre sí. Pero cuando la aplicación sale del eclipse tendrá más problemas encontrando esas clases.
Aham sí ahora sí que te he entendido o eso creo. Desarrollo en Eclipse con la referencia al otro proyecto, pero en el momento de generar el jar elimino la referencia al otro proyecto y lo incluyo como jar dentro del proyecto, ¿es eso verdad? Mañana cuando vuelva a la oficina lo pruebo.
Gracias!
Bueno días!
He intentado hacerlo de otras 2 maneras diferentes, en una de ellas, no me sabe resolver las dependencias y en la otra (añadiendo al build path el directorio classes de la otra aplicación), al realizar el despliegue me da un:
500 Internal Server Error
Servlet error: An exception occurred. The current application deployment descriptors do not allow for including it in this response. Please consult the application log for details.
No se me ocurren muchas más cosas que hacer... no sé si me puedes echar una mano.
Gracias!
Saludos!
La primera manera no has dicho cual fue y la segunda no es buena idea tampoco. Como ya te dije no debes relacionar los dos proyectos en Eclipse excepto para desarrollar.
¿Qué problema tienes creando un jar del proyecto e incluyéndolo en el otro proyecto?
Llamaremos proyecto-jar al proyecto que hay que usar en el proyecto-principal. Si el problema es que al generar el jar del proyecto-jar éste no lleva los otros jars que usa ese proyecto (que es lo normal), entonces el proyecto-principal no encuentra las clases de esas librerías que usa el proyecto-jar. En ese caso hay 2 opciones:
1)Incluir todos los jar que use el proyecto-jar (además del jar del proyecto-jar) en el proyecto-principal
2) Crear un "super-jar" que lleve el proyecto-jar entero y todos sus jar en un solo jar. No es muy elegante (y puede ser grande) pero es una opción que alguna vez he usado. Para eso hay un plugin de eclipse que te lo hace en un click, el Fat jar:
http://fjep.sourceforge.net/
El problema creo que no es ese. El proyecto-principal encuentra todos los jar del proyecto-jar. El problema es que el proyecto jar necesita utilizar unas clases del proyecto-principal, pero estas clases no están en un jar, si no que se encuentran en la source folder del proyecto-principal. Éstas últimas son las clases por las que me da la excepción. En concreto:
oracle.classloader.util.AnnotatedNoClassDefFoundError:
          Falta la clase: com.tsol.tramita.modulos.expedientes.manager.Expedientes
        Clase Dependiente: com.tsol.tramita.gescon.webservice.TramitaHttpBindingImpl
                 Cargador: trewa:1.0
            Origen de Código: /home/sigem/oc4j_tramita/j2ee/home/shared-lib/trewa/1.0/TramitaGPService.jar
          Configuración: <code-source> in /home/sigem/oc4j_tramita/j2ee/home/config/server.xml
La clase que falta está disponible en las siguientes ubicaciones:
        1. Origen de Código: /home/sigem/oc4j_tramita/j2ee/home/applications/tramita-2.0/tramita-2.0/WEB-INF/classes/ (from WEB-INF/classes/ in /home/sigem/oc4j_tramita/j2ee/home/applications/tramita-2.0/tramita-2.0/WEB-INF/classes)
           Este origen de código está Disponible en el cargador tramita-2.0.web.tramita-2.0:0.0.0.
He mirado por internet y se dice de incluir una librería en server.xml del servidor, pero tampoco...
Muchas gracias!
Si los 2 proyectos usan clases cada uno del otro, es un tema peliagudo. Siempre puedes poner un proyecto como jar del otro, pero no los dos a la vez como jar del otro. En este caso me temo que debes duplicar esas clases en los dos proyectos (solución rápida y fea) o meter esas clases que usan los dos proyectos en otro jar y ese jar en los dos proyectos.
Eso sí que lo había pensado... pero me parecía una solución un poco fea. Realmente los 2 proyectos no utilizan clases del otro. Si no que sólo el proyecto-jar utiliza clases del proyecto-principal. El proyecto jar va a ser simplemente Web Service en escucha y que cuando sea invocado alguno de sus métodos va a realizar las operaciones pertinentes dentro del proyecto-principal. Ahora dirás que por qué meterlo en un jar... tema de cliente...
Saludos!
Entonces sí que es un caso algo raro... je je
No te queda otra opción que meter las clases necesarias del proyecto principal en el proyecto-jar (aparte de lo de crear un jar del proyecto principal y ponerlo en el servidor o en el mismo proyecto, que aún las veo más feas)
Sólo he encontrado un caso similar googleando por todo internet, y por desgracia nadie respondió:
http://forums.adobe.com/thread/119852
Hola!
Creo que he conseguido solventar el error que teníamos antes, era tema de la carga de clases del OC4J. Después de cambiar y cambiar la carga de clases que sigue el OC4J he conseguido llegar a la solución. Al final he podido dejar la referencia al proyecto-principal desde mi proyecto-jar.
Muchas gracias por tu atención y tu ayuda.
Saludos!
Pues me alegro, a base de prueba y error se suele conseguir todo.
Recuerda cerrar la pregunta para que no quede colgando.
Respuesta
1
Siento mucho no poder ayudarte, aunque si que entiendo bastante de Java nunca he trabajado con WebServices.
Lo siento mucho, espero que algún otro experto te pueda ayudar mejor que yo.
Respuesta
1
El error muestra que al parecer es el web service lo que esta mal estructurado, verifica el xml, del web que este muy apegado al wsdl, puede ser que lo muestre bien en el navegador pero en la aplicación puede ser que no lo esta escuchando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas