2014-06-11 3 views
0

J'écris un service Web SOAP pour Windows Phone 8(WP8) Enterprise MDM en Java. Le client était WP8, et sa requête SOAP sera comme suit, et je n'ai pas le droit de modifier quoi que ce soit sur cette demande.Liaison JAXB pour les paramètres du corps de la requête SOAP JAX-WS

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/Discover</a:Action> 
     <a:MessageID>urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</a:MessageID> 
     <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
     </a:ReplyTo> 
     <a:To s:mustUnderstand="1">https://ENROLLTEST.CONTOSO.COM/EnrollmentServer/Discovery.svc</a:To> 
    </s:Header> 
    <s:Body> 
     <Discover xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment/"> 
     <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <EmailAddress>[email protected]</EmailAddress> 
      <RequestVersion>1.0</RequestVersion> 
     </request> 
     </Discover> 
    </s:Body> 
</s:Envelope> 

Après ma classe de service,

@WebService(targetNamespace = "http://schemas.microsoft.com/windows/management/2012/01/enrollment/") 
@BindingType(SOAPBinding.SOAP12HTTP_BINDING) 
@Addressing(enabled=true, required=true) 
public interface DiscoveryService { 

    @WebMethod(operationName = "Discover") 
    SOAPMessage handleDiscoveryRequest(@WebParam(name = "request",targetNamespace = "http://www.w3.org/2001/XMLSchema-instance") 
             DiscoveryRequest request) throws Exception; 
} 

Et le corps demande mapping class xml,

@XmlRootElement(name = "request", namespace = "http://www.w3.org/2001/XMLSchema-instance") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class DiscoveryRequest { 

    @XmlElement(name = "EmailAddress", namespace = "http://www.w3.org/2001/XMLSchema-instance") 
    private String emailId; 

    @XmlElement(name = "RequestVersion", namespace = "http://www.w3.org/2001/XMLSchema-instance") 
    private String version; 

    // Getters and Setters 
} 

Cependant, à partir du SOAP UI, j'ai eu la demande d'exemple suivant avec généré WSDL

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:enr="http://schemas.microsoft.com/windows/management/2012/01/enrollment/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Header/> 
    <soap:Body> 
     <enr:Discover> 
     <!--Optional:--> 
     <xsi:request> 
      <!--Optional:--> 
      <xsi:EmailAddress>?</xsi:EmailAddress> 
      <!--Optional:--> 
      <xsi:RequestVersion>?</xsi:RequestVersion> 
     </xsi:request> 
     </enr:Discover> 
    </soap:Body> 
</soap:Envelope> 

Et, Quand j'envoie la demande prévue (première pression de code), j'ai eu la réponse d'erreur suivante dans SOAP UI

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
    <soap:Header> 
     <Action xmlns="http://www.w3.org/2005/08/addressing">http://schemas.microsoft.com/windows/management/2012/01/enrollment/DiscoveryService/Discover/Fault/UnmarshalException</Action> 
     <MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:d81dbc0f-cbd4-41dc-aa62-aed06f3c2dc6</MessageID> 
     <To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To> 
     <RelatesTo xmlns="http://www.w3.org/2005/08/addressing">urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478</RelatesTo> 
    </soap:Header> 
    <soap:Body> 
     <soap:Fault> 
     <soap:Code> 
      <soap:Value>soap:Sender</soap:Value> 
     </soap:Code> 
     <soap:Reason> 
      <soap:Text xml:lang="en">Unmarshalling Error: unexpected element (uri:"http://schemas.microsoft.com/windows/management/2012/01/enrollment/", local:"request"). Expected elements are &lt;{http://www.w3.org/2001/XMLSchema-instance}request></soap:Text> 
     </soap:Reason> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Toute aide sur la façon de résoudre ce problème d'espace de noms contraignant JAXB?

Unmarshalling Error: unexpected element (uri:"http://schemas.microsoft.com/windows/management/2012/01/enrollment/", local:"request"). Expected elements are &lt;{http://www.w3.org/2001/XMLSchema-instance}request 

Répondre

1

La demande d'exemple et les mappages ne correspondent pas.

Dans la première requête, l'élément 'request' se trouve dans l'espace de noms '.../enrollment'. Malgré les xmlns: i est définie pour elle, le préfixe est pas défini, il hérite de l'espace de noms par défaut, qui est fixé à parent:

<Discover xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment/"> 
    <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

Le message d'erreur est tout à fait correct.

Pour faire cette demande par exemple pour répondre à vos intentions (et correspondre WSDL), vous devriez avoir

 <i:request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

Note 'i:' préfixe. Si la requête est canonique (c'est-à-dire si une requête correcte est fournie à titre d'exemple), vous devez alors mettre à jour votre mappage, c'est-à-dire, supprimer XMLSchema-instance en tant que targetNamespace.

Le reste semble correct pour un look décontracté. Généralement, quand je traite avec SOAP, je suggère de fournir le WSDL, aussi.

+0

Je ne peux pas modifier la demande. C'est défini par WP8. Pouvez-vous élaborer davantage sur l'élimination de l'espace de nom de la cible? –

+0

Regardez votre classe de service et mappage: partout où vous voyez XMLSchema-instance, supprimez-le et remplacez-le par l'espace de noms '.../enrollment'. Les éléments 'request', 'EmailAddress' et 'RequestVersion' doivent être dans l'espace de nommage 'enrollment', en particulier. – GenericParallel

+0

Ok, je l'ai fait, Maintenant, je reçois, l'action «Action http://api.agent.windows.wso2.org/DiscoveryService/DiscoverRequest pas pris en charge» erreur –

Questions connexes