JAX-WS serveur-side SOAPHandler that returns fault obtient "Internal Error" sur WebSphere v8
j'ai un serveur-côté JAX-WS SOAPHandler
(sur WebSphere v8) que dans certains cas doit répondre au client avec une réponse SOAP qu'il a dans une variable String (appelons-le responseXml
).
Quand responseXml
contient un message SOAP réussi (c.-à-d. non fautif), JAX-WS envoie la réponse au client correctement. Toutefois, 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 de responseXml
, comme montré 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)
...
Ici est simplifié SOAPHandler
cela illustre ce problème. (Notez que la valeur de responseXml
montré ici n'est qu'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 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) {
}
}
j'obtiens exactement la même 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 pour JAXWSMessageReceiver
, et il semble que sous les couvertures, Axis2 cherche une cause parexception, mais bien sûr dans ce cas il n'y en a pas.
est-ce que quelqu'un sait pourquoi cela se produit ou comment cela peut être réparé? Merci!
5 réponses
j'ai eu le même problème et j'ai pu le résoudre en désactivant le unifiée de gestion des pannes (c'est pas un bug, c'est une fonctionnalité!).
Sur le EST le Développeur de la console
https://<yourhost>/<yourport>/ibm/console/login.do
fais comme décrit ici (pour WAS8):
Cliquez Sur Serveurs > Types De Serveurs. et soit WebSphere application servers > server_name ou WebSphere serveurs proxy > server_name. Ensuite, dans la section Infrastructure du serveur, cliquez sur Java et process. gestion > définition du processus, et sélectionnez Contrôle, serviteur ou Adjoint. Puis cliquez sur machine virtuelle Java > propriétés personnalisées.
là, ajouter une nouvelle propriété webservices.unify.faults
et réglez la valeur false
.
le problème réel n'est pas le manque causé par exception, c'est plutôt un traitement de défaut unifié 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 fonctionnalité de sécurité activée par défaut, il suffit de retourner le message "Internal Error". Ceci est fait pour " empêcher les informations détaillées concernant les raisons pour lesquelles le traitement des messages entrants a échoué d'être retourné aux expéditeurs de messages". Rechercher " webservices.unifier.les défauts"
pour désactiver cette fonctionnalité, ajoutez A-Dwebservices.unifier.défauts=false pour votre JVM propriétés personnalisées.
cette erreur peut être corrigée en désactivant la fonctionnalité générique de traitement des erreurs sur les serveurs D'application web D'IBM.
afin de désactiver cette propriété, naviguez vers la Console D'administration > Serveurs > Serveurs D'Application > > définition du 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 installez les oreilles pour obtenir les erreurs WSDL personnalisées pour votre Les transactions SOAP.
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 avions deux Services avec exactement le même nom de méthode mais différent targetNameSpace, comme DomainService1 a 'get' méthode et DomainService2 a aussi 'get' méthode, mais a ÉTÉ 8.5.5.12 lance cette exception et ne donne aucun indice pour trouver la cause racine. Apparemment WAS est plus strict dans la version récente avec le nom du méthode.
C'était l'exception: org.Apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: une erreur d'assertion interne s'est produite. COM.xxx.web.myapp.service.jaxws.L'objet GetResponse JAXB n'a pas de xml xxxxxStatus
après avoir changé le nom de la méthode spécifique à chaque service 'getABC' et 'getPQR' cela a fonctionné!!!
j'espère que ça fonctionnera!