Ho un JAX-WS lato server SOAPHandler
(su WebSphere v8) che in alcuni casi deve rispondere al client con una risposta SOAP che ha una variabile String (chiamiamola responseXml
).SOAPHandler lato server che restituisce l'errore riceve "Errore interno" su WebSphere v8
Quando responseXml
contiene un messaggio SOAP riuscito (cioè non di errore), JAX-WS invia correttamente la risposta al client. Tuttavia, quando responseXml
contiene un messaggio di errore SOAP, un "Errore interno" si verifica, e il cliente ottiene una reazione all'anomalia diverso da quello in responseXml
, come mostrato qui:
<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>
Il seguente errore viene scritto nella console :
[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)
...
Ecco un semplificata SOAPHandler
che illustra questo problema. (Notare che il valore di responseXml
qui mostrato è solo un esempio.) Nel mio attuale SOAPHandler
, le risposte non sono codificate ma vengono lette da un database. Sto solo cercando di mostrare il codice di esempio più semplice possibile.)
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) {
}
}
ottengo lo stesso errore esatto in cui ho il codice SOAPHandler
per creare un oggetto SOAPFault
(utilizzando un SOAPFactory
) e gettarlo in un SOAPFaultException
.
Sulla base della traccia dello stack, ho guardato il codice sorgente per JAXWSMessageReceiver
, e sembra sotto le copertine, Axis2 sta cercando una eccezioneByException, ma ovviamente in questo caso non ce n'è uno.
Qualcuno sa perché questo sta accadendo o come può essere risolto? Grazie!
Sono stato 8.5.5 ma dovevo ancora applicare la variabile noi services.unify.faults per aggirare il problema –