JAX-WS côté serveur SOAPHandler qui renvoie obtient la faute “Erreur Interne” sur WebSphere v8
J'ai un serveur-côté JAX-WS SOAPHandler
(sur WebSphere v8) qui, dans certains cas, les besoins pour répondre au client avec un SAVON réponse qu'il a dans une variable de Chaîne (appelons responseXml
).
Quand responseXml
contient un succès (c'est à dire, de non-défaut) message SOAP, JAX-WS envoie la réponse au client correctement. Toutefois, lorsque responseXml
contient un SAVON de message d'erreur, une Erreur Interne se produit, et le client obtient une autre anomalie de la réponse que l'on en 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>
Le message d'erreur suivant est écrit dans 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)
...
Ici est simplifié SOAPHandler
qui illustre bien ce problème. (Notez que la valeur de responseXml
montré ici est juste un exemple. Dans ma réelle SOAPHandler
, les réponses ne sont pas codées en dur mais sont lues à partir d'une base de données. J'essaie juste de montrer le plus simple exemple de code 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 obtenir exactement le même message d'erreur quand je code le SOAPHandler
pour créer un SOAPFault
objet (à l'aide d'un SOAPFactory
) et de le jeter dans un SOAPFaultException
.
Basé sur la trace de la pile, j'ai regardé le code source de JAXWSMessageReceiver
, et il semble que sous les couvertures, Axis2 est à la recherche d'un causedByException, mais bien sûr, dans ce cas, il n'en est pas une.
Personne ne sait pourquoi ce qui se passe ou comment il peut être fixé? Merci!
OriginalL'auteur user1717528 | 2012-10-09
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et a pu le résoudre par la désactivation de la unifiée de gestion des pannes (c'est pas un bug, c'est une fonctionnalité!).
Sur le EST le Développeur de la console
fais comme décrit ici (pour WAS8):
D'ajouter une nouvelle propriété
webservices.unify.faults
et définissez la valeur àfalse
.OriginalL'auteur schnatterer
Le problème réel n'est pas le manque causé par exception, il est plutôt un système unifié de gestion des pannes dans websphere:
http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524
Soit utiliser la solution de contournement décrite ou d'installer au moins 8.0.0.4
OriginalL'auteur Thomas
WebSphere partir de la version 8 a un défaut activé la fonction de sécurité, juste retour le message "Erreur Interne". Ceci est fait pour "la prévention des informations détaillées concernant les raisons de message entrant traitement a échoué d'être renvoyé à des expéditeurs de messages". Recherche pour "webservices.unifier.les défauts"
Pour désactiver cette fonction, ajoutez une -Dwebservices.unifier.défauts=false pour votre JVM propriétés personnalisées.
OriginalL'auteur gregory
Cette erreur peut être résolu en désactivant le générique de gestion des Pannes fonctionnalité sur IBM Websphere Application des Serveurs.
Afin de désactiver cette propriété accédez à la Console d'Admin > Serveurs > Serveurs d'Applications > > Définition de Processus > Machine Virtuelle Java > Propriétés Personnalisées.
Entrez la Clé comme " webservice.unifier.défauts' et la valeur 'false'.
Une fois mise à jour, redémarrez votre serveur et d'installer les Oreilles pour obtenir le WSDL Personnalisé des erreurs pour votre SAVON transactions.
OriginalL'auteur Pawan J
J'ai eu le même problème après la mise à niveau a ÉTÉ FP 8.5.5.10 à 8.5.5.12. Nous avons eu 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 a ÉTÉ 8.5.5.12 lève cette exception et ne donne aucun indice pour trouver la cause racine. Apparemment, est plus strict dans la version récente avec les noms de méthodes.
C'était l'exception:
org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: Une assertion interne erreur s'est produite. La com.xxx.web.myapp.services.jaxws.GetResponse JAXB objet n'a pas de xxxxxStatus xml
Après la modification du nom de la méthode spécifique à chaque de service "getABC" et "getPQR' il a travaillé!!!
espère que cela fonctionne!
OriginalL'auteur budipem