2012-10-09 21 views
15

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!

risposta

3

Il problema reale non è il mancante causato da eccezione, è piuttosto una manipolazione in websphere guasto unitaria:

http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524

utilizzare la soluzione descritta o installare almeno 8.0.0.4

+0

Sono stato 8.5.5 ma dovevo ancora applicare la variabile noi services.unify.faults per aggirare il problema –

3

Ho avuto lo stesso problema ed è stato in grado di risolverlo disabilitando la gestione degli errori unificati (non è un bug, è una funzionalità!).

Sulla WAS console Developer

https://<yourhost>/<yourport>/ibm/console/login.do 

fare come descritto here (per WAS8):

Fare clic su Server> Tipi di server. e server delle applicazioni WebSphere> nome_server o server proxy WebSphere> nome_server. Quindi, nella sezione Infrastruttura server, fare clic su Gestione processo e Java> Definizione processo e selezionare Controllo, Servant o Adjunct. Quindi fare clic su Java virtual machine> Proprietà personalizzate.

Lì, aggiungere una nuova proprietà webservices.unify.faults e impostare il valore su false.

enter image description here

0

Questo errore può essere risolto disabilitando la gestione caratteristica su IBM WebSphere Application Server Fault generico.

Per disabilitare questa proprietà, accedere a Admin Console> Server> Server delle applicazioni>> Definizione processo> Java Virtual Machine> Proprietà personalizzate.

Immettere la chiave come "webservice.unify.faults" e valore come "falso".

Una volta aggiornato, riavviare il server e installare gli EAR per ottenere gli errori WSDL personalizzati per le transazioni SOAP.

0

Ho avuto lo stesso problema dopo l'aggiornamento WAS FP 8.5.5.10 a 8.5.5.12. Abbiamo avuto due servizi con esattamente lo stesso nome del metodo, ma diversi targetNamespace, come DomainService1 ha 'ottenere' metodo e DomainService2 ha anche 'ottenere' metodo, ma è stato 8.5.5.12 genera questa eccezione e non dà qualsiasi indizio per trovare la causa principale. Apparentemente WAS è più severo nella versione recente con la denominazione dei metodi.

Questa era eccezione: org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: Si è verificato un errore di asserzione interna. L'oggetto com.xxx.web.myapp.services.jaxws.GetResponse JAXB non dispone di un xml xxxxxStatus

Dopo aver cambiato il nome del metodo specifico per ogni servizio 'getABC' e 'getPQR' ha funzionato !!!

spero che funzioni!