2011-06-16 5 views
1

J'essaye de migrer de l'axe vers cxf et j'ai des fichiers wsdl que le plugin génère en code java. J'ai 2 questions:migrer de l'axe vers cxf

  1. Je le bloc suivant dans le fichier wsdl:

    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    et anyURI est généré à chaîne au lieu d'URI, personne ne sait pourquoi? L'axe crée une classe de localisateur de service et une classe de liaison de liaison qui permet d'ajouter aux attributs de service Web tels que le nom d'utilisateur, le mot de passe, le délai, etc. Je dois ajouter ces attributs car la connexion est sécurisée. pas de paramètres dans la méthode générée par le service Web sendSms. (Vous pouvez voir les définitions ci-dessous).

    <wsdl:portType name="SendSms"> 
        <wsdl:operation name="sendSms"> 
        <wsdl:input message="parlayx_sms_send:SendSms_sendSmsRequest"/> 
        <wsdl:output message="parlayx_sms_send:SendSms_sendSmsResponse"/> 
        <wsdl:fault message="parlayx_common_faults:ServiceException" name="ServiceException"/> 
        <wsdl:fault message="parlayx_common_faults:PolicyException" name="PolicyException"/> 
        </wsdl:operation> 
    </wsdl:portType> 
    
    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    Je ne trouve aucun exemple que je suis certain qu'il montre comment ajouter ces valeurs. Connaissez-vous un tel exemple?

Merci, Daniela

Répondre

0

À propos de votre première question, CXF utilise JAXB (par défaut) pour effectuer la conversion entre XML et des objets, et qui précise que anyURI est associé à un String. Vous devez effectuer la conversion vous-même, en utilisant new URI(str) si vous souhaitez une exception cochée sur un URI non valide ou URI.create(str) si vous préférez une exception non vérifiée. Alors que vous pouvez enregistrer un convertisseur personnalisé pour gérer cela pour vous, il me semble être beaucoup plus compliqué que de le faire vous-même; une ligne de code supplémentaire par argument URI (ou peut-être plusieurs si vous utilisez la route d'exception vérifiée, ce qui est probablement formellement meilleur).

Sur votre deuxième question, la clé est que les talons de clients générés par CXF (ou tout autre côté client conforme JAX-WS) seront également implémenter l'interface javax.xml.ws.BindingProvider. Cela conduit à coder un peu comme ceci:

// Use the right things from your tooling here... 
SendSMS serviceInstance = new SMSSender().getSendSMSImplPort(); 

Map<String, Object> requestContext = 
     ((BindingProvider) serviceInstance).getRequestContext(); 
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceAddress); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, username); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
// And so on for all the properties you want to configure 

Timeouts sont un peu différentes, comme dans CXF ils sont configured at the conduit level. La pièce pertinente de ce fil semble être cet extrait (qui appartient à l'intérieur du fichier cxf.xml):

<http:conduit name="http://131.107.153.205/.*"> 
    <http:client ConnectionTimeout="0" ReceiveTimeout="0"/> 
</http:conduit> 

Je ne sais pas exactement comment vous changer cela pour adapter à vos besoins (en particulier le conduit prénom); c'est un domaine où j'ai été coller avec les défauts par défaut pour être honnête. (Vous pourriez être en mesure de set it at the code level - voir les commentaires - mais ce n'est pas particulièrement clair pour moi.) Notez également dans ce qui précède que les deux délais d'attente sont définis par ce code pour n'avoir aucun délai d'attente du tout; ce n'est probablement pas ce que vous voulez dans le code de production ...

+0

Merci. En ce qui concerne la deuxième réponse, je ne suis pas tout à fait sûr comment puis-je trouver l'interface de liaison. J'ai une interface SendSms avec la méthode telle que définie et un SendSmsService dont je peux faire getSendSms et recevoir l'interface. – Daniela

0

Oui, CXF utilise JAXB (par défaut) pour effectuer la conversion entre XML et les objets, et qui spécifie que anyURI est mappé à une chaîne. Cependant, il est possible de changer la liaison entre les types Java et les types SOAP.Voici un fichier de liaison pour JAXB, qui associe xs:anyURI à java.net.URI

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

     <jaxb:globalBindings 
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <jaxb:javaType name="java.net.URI" xmlType="xs:anyURI" 
       parseMethod="create" printMethod="toASCIIString" /> 
     </jaxb:globalBindings> 
</jaxb:bindings> 

Pour cette utilisation en donner l'option -b-wsdl2java, qui spécifie les fichiers de liaison JAXWS ou JAXB

wsdl2java -b type-bindings.xml ...