Problème
Création d’un gestionnaire JAX-WS pour injecter automatiquement une adresse Mac dans l’en-tête de requête SOAP côté client:
Fichier: MacAddressInjectHandler.java
public class MacAddressInjectHandler implements SOAPHandler<SOAPMessageContext>{ @Override public boolean handleMessage(SOAPMessageContext context) { //...... //get mac address String mac = getMACAddress(); //add a soap header, name as "mac address" QName qname = new QName("http://ws.mkyong.com/", "mac address"); SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(qname); soapHeaderElement.setActor(SOAPConstants.URI__SOAP__ACTOR__NEXT); soapHeaderElement.addTextNode(mac); soapMsg.saveChanges(); //...... } //...... }
Lorsque le message SOAP est généré et envoyé au fournisseur du service (ou au serveur), il renvoie immédiatement le message d’erreur suivant:
com.sun.xml.internal.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStreamException: ParseError at[row,col]:[1,110] Message: Attribute name "address" associated with an element type "mac" must be followed by the ' = ' character. //... Caused by: javax.xml.stream.XMLStreamException: ParseError at[row,col]:[1,110] Message: Attribute name "address" associated with an element type "mac" must be followed by the ' = ' character. //...
Solution
XMLStreamException
indique que vous essayez d’envoyer un message SOAP non valide contenant un format non valide. À partir du client SOAP ci-dessus, vous pouvez générer un message SOAP similaire à celui-ci:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header> <mac address xmlns="http://ws.mkyong.com/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:actor="http://schemas.xmlsoap.org/soap/actor/next"> 90-4C-E5-44-B9-8F </mac address> </S:Header> <S:Body> <ns2:getServerName xmlns:ns2="http://ws.mkyong.com/"/> </S:Body> </S:Envelop
Et remarquez l’attribut " mac address "? Le " espace " entre les deux provoque que "l’adresse" est devenu un attribut pour l’élément "mac".
Pour résoudre ce problème, supprimez simplement les espaces suivants:
QName qname = new QName("http://ws.mkyong.com/", "macaddress");
lien://tag/jax-ws/[jax-ws]lien://tag/web-services/[services web]