JAX-WS SOAPHandler
côté serveur (sur WebSphere v8) doit dans certains cas répondre au client avec une réponse SOAP figurant dans une variable String (appelons-le responseXml
).
Lorsque responseXml
contient un message SOAP réussi (c'est-à-dire sans faute), JAX-WS envoie correctement la réponse au client. Cependant, lorsque responseXml
contient un message d'erreur SOAP, une "erreur interne" se produit et le client obtient une réponse d'erreur différente de celle contenue dans responseXml
, comme illustré ici:
<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>
L'erreur suivante est écrite sur la 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)
...
Voici une SOAPHandler
simplifiée qui illustre ce problème. (Notez que la valeur de responseXml
indiquée ici n'est qu'un exemple. Dans ma SOAPHandler
réelle, les réponses ne sont pas codées en dur mais sont lues dans une base de données. J'essaie simplement de montrer l'exemple de code le plus simple possible.)
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) {
}
}
Je reçois exactement la même erreur lorsque je code la SOAPHandler
pour créer un objet SOAPFault
(en utilisant une SOAPFactory
) et la jette dans une SOAPFaultException
.
Sur la base de la trace de la pile, j’ai examiné le code source de JAXWSMessageReceiver
, et il semble que sous les couvertures, Axis2 recherche une cause causée par une exception, mais bien sûr, il n’en existe pas.
Est-ce que quelqu'un sait pourquoi cela se produit ou comment il peut être corrigé? Merci!
J'ai eu le même problème et j'ai pu le résoudre en désactivant le traitement unifié des erreurs (ce n'est pas un bug, c'est une fonctionnalité!).
Sur la console WAS Developer
https://<yourhost>/<yourport>/ibm/console/login.do
faites comme décrit ici (pour WAS8):
Cliquez sur Serveurs> Types de serveur. et WebSphere Application Server> nom_serveur ou serveurs WebSphere Proxy> nom_serveur. Ensuite, dans la section Infrastructure du serveur, cliquez sur Gestion du processus et de Java> Définition du processus, puis sélectionnez Contrôle, Servant ou Ajout. Cliquez ensuite sur Machine virtuelle Java> Propriétés personnalisées.
Là, ajoutez une nouvelle propriété webservices.unify.faults
et définissez la valeur sur false
.
Le problème réel n’est pas la cause des exceptions manquantes, mais plutôt une gestion unifiée des erreurs dans Websphere:
http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524
Utilisez la solution de contournement décrite ou installez au moins 8.0.0.4.
WebSphere à partir de la version 8 a une fonction de sécurité activée par défaut, renvoyant simplement le message "Erreur interne". Ceci est fait pour " empêcher que des informations détaillées sur la raison pour laquelle le traitement des messages entrants a échoué soient renvoyées aux expéditeurs de messages ". Recherche de "webservices.unify.faults"
Pour désactiver cette fonctionnalité, ajoutez -Dwebservices.unify.faults = false à vos propriétés personnalisées JVM.
Cette erreur peut être résolue en désactivant la fonctionnalité de gestion des incidents générique sur les serveurs IBM Websphere Application Server.
Pour désactiver cette propriété, accédez à Console d'administration> Serveurs> Serveurs d'applications>> Définition de processus> Machine virtuelle Java> Propriétés personnalisées.
Entrez la clé en tant que 'webservice.unify.faults' et la valeur en tant que 'false'.
Une fois la mise à jour mise à jour, redémarrez votre serveur et installez les fichiers EAR afin d’obtenir les erreurs WSDL personnalisées pour vos transactions SOAP.
J'ai eu le même problème après la mise à niveau du WAS FP 8.5.5.10 à 8.5.5.12 . Nous avions deux services avec exactement le même nom de méthode mais différents targetNameSpace , comme DomainService1 a 'get' méthode et DomainService2 a également 'get' méthode, mais WAS 8.5.5.12 jette cette exception et ne donne aucun indice pour trouver la cause fondamentale. Apparemment, WAS est plus strict dans la version récente avec la désignation des méthodes.
Il s'agissait de l'exception: org.Apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: une erreur d'assertion interne s'est produite. L'objet JAXB com.xxx.web.myapp.services.jaxws.GetResponse n'a pas d'objet xxxxxStatus xml
Après avoir changé le nom de la méthode spécifique à chaque service 'getABC' et 'getPQR' cela a fonctionné !!!
espérons que cela fonctionne!