3 Stimmen

Webservice liefert java.lang.reflect.InvocationTargetException

Ich erhalte die obige Meldung, wenn ich eine Anfrage an einen Java-Webservice stelle.

Ursprünglich haben wir eine Java-Konsolenanwendung erstellt und manuell eine xml-Datei übermittelt. Wenn wir dies als Java-Anwendung ausführen, wird die Antwort erfolgreich erstellt und mithilfe von System.out.println angezeigt. Wir erstellen den Webdienst, indem wir die Java-Datei auswählen, die die Methoden enthält, und "create webservice" wählen, wobei wir das dynamische Projekt angeben, in dem der Webdienst erstellt werden soll, sowie die Methoden, die ausgesetzt werden sollen.

Was die Anwendung tut, ist eine xml-Datei zu nehmen und unmarshalling diese zu einem Objekt mit:

 public static Object unmarshalToObject(Class classToBeBound,
   String xmlRequest) {
  Object obj = new Object();
  try {
   JAXBContext jc = JAXBContext.newInstance(classToBeBound);
   Unmarshaller um = jc.createUnmarshaller();
   obj = um.unmarshal(new StringReader(xmlRequest));
  } catch (Exception e) {
   e.printStackTrace()
  }
  return obj;
 }

Die Datei wird verarbeitet, und anschließend wird ein Objekt wie folgt in xml umgewandelt:

 public static String marshalToXML(Object data) {
  StringWriter sw = new StringWriter();
  try {
   logger.info("Create new Marshall");
   JAXBContext jc = JAXBContext.newInstance("ContextPathName");
   logger.info("Marshalled to xmlObjects");
   Marshaller marshaller = jc.createMarshaller();
   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
   marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
   marshaller.marshal(data, sw);
  } catch (Exception e) {
   logException(logger, e);
  }
  return sw.toString();
 }

Die folgende Codezeile scheint ein Problem zu verursachen, da der Logger die Meldung vor dieser Zeile anzeigt:

JAXBContext jc = JAXBContext.newInstance("ContextPathName");

Der Webservice kommt nie zur nächsten Zeile - das Folgende ist der Körper der SOAP-Nachricht:

  <soapenv:Fault>
     <faultcode>soapenv:Server.userException</faultcode>
     <faultstring>java.lang.reflect.InvocationTargetException</faultstring>
     <detail>
        <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">servername</ns1:hostname>
     </detail>
  </soapenv:Fault>

Ich habe Try/Catch um diesen Codeabschnitt herum hinzugefügt und sogar nach JAXBExceptions gesucht, aber das scheint nichts abzufangen - auch nicht die allgemeine Ausnahme.

Dieses Problem tritt nicht auf, wenn die Konsolenanwendung ausgeführt wird. Der Build-Pfad für diese Anwendung enthält den folgenden Inhalt von sun \jwsdp -2.0 \jaxb\lib :

jaxb-api.jar
jsr173_1.0_api.jar
jaxb-impl.jar

Ich habe sie dem Ordner lib in der WEB-INF-Datei des dynamischen Projekts hinzugefügt.

Ich führe den Webservice in JBuilder 2008 R2 aus und verwende SOAPUI, um die Anforderung zu übermitteln - dies verweist auf die wsdl, die beim Erstellen des Webservice generiert wurde.

Wenn jemand Hilfe oder Ideen hat, wie man das Problem lösen kann, bitte antworten - danke, dass Sie sich die Zeit genommen haben, diesen Beitrag zu lesen!

5voto

Ich tue ganz ähnlich wie Sie, wobei in einige XML über SOAP und Marshalling es in Objekte. Dies ist nicht unbedingt mit dem Problem verbunden.

Die InvocationException wird ausgelöst, wenn ein Problem bei der Ausführung von Java-Code innerhalb von Axis bei der Verarbeitung der Anforderung auftritt. Sie müssen einige zusätzliche Optionen angeben, um Zugriff auf die Protokollausgabe von Axis selbst zu erhalten. Sobald Sie diese Ausgabe haben, werden Sie höchstwahrscheinlich eine für Sie sinnvolle Ausnahme sehen (in meinem Fall habe ich eine Klasse verwendet, die ich nicht in meinen Server-Klassenpfad aufgenommen hatte).

Grundsätzlich müssen Sie einen LogHandler zu Ihrer WSDD-Datei hinzufügen. Auf der folgenden Seite finden Sie eine gute Anleitung, was Sie in der WSDD-Datei benötigen. Allerdings spricht diese Seite über die client-config.wsdd für einen Axis-Client, während ich Axis in meiner EAR bündle und die Änderungen an der server-config.wsdd vorgenommen habe.

http://www.theserverside.com/discussions/thread.tss?thread_id=35765

Diese Seite enthält Informationen, die sich speziell auf Tomcat beziehen

Beachten Sie, dass der Speicherort von axis.log je nach Server und Betriebssystem variieren kann. Einige Leute berichten, dass es im System32-Verzeichnis von Windows erscheint, der zweite Link besagt, dass es im bin/-Verzeichnis von Tomcat erscheint. In meinem Fall (Mac OS X, Glassfish 2.1.1) tauchte es im Verzeichnis config/ meiner Domain auf.

0voto

Light Yagami Punkte 311

Ich habe dieses Problem kürzlich erlebt. Es tritt auf, wenn wir nicht in der Lage sind, relevanten Java-Code auf dem Server zu finden, auf den wir verweisen.

Hier sind einige Möglichkeiten, die Sie in Betracht ziehen könnten:

Die richtige JAR-Datei ist nicht auf dem Server vorhanden

Die WSDL und die nachfolgende Jar-Datei auf dem Server wurden aktualisiert und die verbrauchte WSDL ist NICHT die neueste

- Typs in dem JAR-Ordner. In den meisten Fällen benennen Benutzer ihre alten JAR Dateien um, bevor sie die neu aktualisierten JAR-Dateien platzieren. Dies sollte NICHT geschehen, da die richtigen Methoden nicht übernommen werden. Beseitigen Sie also ALLE unnötigen JAR-Dateien vom SERVER. siehe unten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X