JAX-WS serverseitige SOAPHandler zurückgibt, die Schuld bekommt "Internen Fehler" auf WebSphere v8
Ich habe eine server-side-JAX-WS SOAPHandler
(auf WebSphere v8), dass in bestimmten Fällen reagieren muss, um dem client eine SOAP-Antwort, dass es in einer String-variable (nennen wir es responseXml
).
Wenn responseXml
enthält eine erfolgreiche (d.h., nicht-Schuld) SOAP-Nachricht, JAX-WS sendet die Antwort an den client korrekt. Allerdings, wenn responseXml
enthält eine SOAP-fault-Nachricht, einen "Internen Fehler" Auftritt, und der client bekommt einen anderen Fehler als Antwort, als die, die in responseXml
wie hier gezeigt:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>axis2ns1:Server</faultcode>
<faultstring>Internal Error</faultstring>
<detail/>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Wird die folgende Fehlermeldung in die Konsole geschrieben:
[10/9/12 12:21:04:177 EDT] 00000025 AxisEngine E org.apache.axis2.engine.AxisEngine receive An error was detected during JAXWS processing
org.apache.axis2.AxisFault: An error was detected during JAXWS processing
at org.apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.java:208)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:198)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.java:1466)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
...
Hier ist eine vereinfachte SOAPHandler
illustriert dieses problem. (Beachten Sie, dass der Wert von responseXml
hier gezeigt wird, ist nur ein Beispiel. In meiner tatsächlichen SOAPHandler
die Antworten sind nicht hart codiert, sondern werden aus einer Datenbank ausgelesen. Ich versuche nur zu zeigen das einfachste Beispiel-code möglich.)
package simplified.demo;
import java.io.ByteArrayInputStream;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class FaultyHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!outbound) {
String responseXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header></soapenv:Header><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>ORA-01031: insufficient privileges</faultstring><detail/></soapenv:Fault></soapenv:Body></soapenv:Envelope>";
try {
SOAPMessage newMsg = createSOAPMessage(responseXml);
context.setMessage(newMsg);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return (outbound);
}
private SOAPMessage createSOAPMessage(String responseXml) {
try {
ByteArrayInputStream in = new ByteArrayInputStream(responseXml.getBytes());
MessageFactory messageFactory = MessageFactory.newInstance();
return messageFactory.createMessage(null, in);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return true;
}
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public void close(MessageContext context) {
}
}
Ich bekomme die exakt gleiche Fehlermeldung, wenn ich code die SOAPHandler
zu erstellen SOAPFault
- Objekt (mit einem SOAPFactory
) und werfen Sie es in eine SOAPFaultException
.
Basierend auf den stack-trace, sah ich auf den source-code für JAXWSMessageReceiver
und es sieht aus wie unter der Decke, Axis2 ist auf der Suche nach einem causedByException, aber natürlich gibt es in diesem Fall nicht ein.
Weiß jemand, warum dies passiert ist oder wie es behoben werden kann? Danke!
InformationsquelleAutor der Frage user1717528 | 2012-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und konnte es lösen durch das deaktivieren der einheitliche Fehlerbehandlung (es ist kein bug es ist ein feature!).
WAR auf der Entwickler-Konsole
wie beschrieben hier (WAS8):
Gibt, fügen Sie eine neue Eigenschaft
webservices.unify.faults
und setzen Sie den Wert auffalse
.InformationsquelleAutor der Antwort schnatterer
Das eigentliche problem ist nicht die fehlende, verursacht durch eine Ausnahme, es ist vielmehr eine einheitliche Fehlerbehandlung in websphere:
http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524
Entweder verwenden Sie die beschriebene Problemumgehung installieren, oder zumindest 8.0.0.4
InformationsquelleAutor der Antwort Thomas
WebSphere ab version 8 hat eine Standard-Sicherheits-feature aktiviert, einfach wieder die Meldung "Interner Fehler". Dieses wird getan, um "Verhinderung Detailangaben warum inbound-message-Verarbeitung ist fehlgeschlagen, die aus der Rückgabe an Absender". Suche für webservices.von unify.Fehler"
Um diese Funktion zu deaktivieren, fügen Sie ein -Dwebservices.von unify.Fehler=false, um Ihre benutzerdefinierte JVM-Eigenschaften.
InformationsquelleAutor der Antwort gregory
Dieser Fehler kann behoben werden, indem Sie das generische Fehler-handling-Funktion, die auf dem IBM Websphere Application Server.
Damit deaktivieren Sie diese Eigenschaft navigieren Sie zu dem Admin-Konsole - > Server > Application-Server > > Prozess-Definition > Java Virtual Machine > Benutzerdefinierte Eigenschaften.
Geben Sie den Schlüssel als " webservice.von unify.Fehler' und den Wert als "false".
Einmal aktualisiert, starten Sie Ihren server neu, und installieren Sie die Ohren, um die Benutzerdefinierte WSDL-Fehler für das SOAP-Transaktionen.
InformationsquelleAutor der Antwort Pawan J
Ich hatte das gleiche Problem nach dem Upgrade WURDE FP 8.5.5.10 zu 8.5.5.12. Wir hatten zwei Dienste mit genau dem gleichem Methodennamen, aber verschiedenen targetNameSpace,wie DomainService1 hat 'get' Methode und DomainService2 hat auch 'get' - Methode, aber WAR 8.5.5.12 wirft diese Ausnahme und nicht geben irgendeinen Hinweis auf die Ursache. Anscheinend WURDE mehr strenge in der letzten version mit der Benennung der Methoden.
Dies war die Ausnahme:
org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: Eine interne assertion-Fehler aufgetreten. Die com.xxx.web.myapp.services.jaxws.GetResponse JAXB-Objekt nicht über eine xxxxxStatus xml
Nach dem ändern der name der Methode spezifisch für jeden service 'getABC' und 'getPQR' es hat geklappt!!!
hoffe, das funktioniert!
InformationsquelleAutor der Antwort budipem