2009-10-21 7 views
1

Je travaille avec un service web qui fournit des fonctionnalités de base CRUD. La récupération est assez facile de travailler avec, mais j'ai du mal à travailler avec le Créer (je n'ai pas encore joué avec les fonctions de mise à jour ou de suppression).ColdFusion, WSDL et les classes complexes étendues

La fonction de mise à jour prend un seul argument. C'est un zObject dans le WSDL. Cependant, c'est un objet générique étendu par ce que j'ai réellement besoin de passer. Si je veux créer un compte, par exemple, je passe un objet Account qui étend la définition de zObject.

Je ne peux pas pour la vie de ma figure sur la façon d'obtenir CF pour me permettre de le faire.

Répondre

3

ColdFusion implémente le moteur Apache Axis pour ses fonctionnalités de service Web. Malheureusement, CF ne tire pas pleinement profit du modèle d'objet SOAP et permet aux développeurs CF de "nouveau" les différents objets qui composent un service (ou de les sous-classer).

Heureusement, il y a quelque chose que nous pouvons faire à ce sujet. Lorsque vous accédez pour la première fois à un WSDL, l'axe génère un ensemble d'objets stub. Ce sont des classes java régulières qui contiennent getters et setters pour les propriétés de base de l'objet. Nous devons utiliser ces stubs pour construire notre objet.

Pour utiliser ces talons cependant, nous avons besoin de les ajouter au chemin de classe ColdFusion :

Step 1) Access the WSDL in any way with coldfusion. 
Step 2) Look in the CF app directory for the stubs. They are in a "subs" 
     directory, organized by WSDL.like: 
     c:\ColdFusion8\stubs\WS\WS-21028249\com\foo\bar\ 
Step 3) Copy everything from "com" on down into a new directory that exists in 
     the CF class path. or we can make one like: 
     c:\ColdFusion8\MyStubs\com\foo\bar\ 
Step 4) If you created a new directory add it to the class path. 
     A, open CF administrator 
     B. click on Server settings >> Java and JVM 
     C. add the path to "ColdFusion Class Path". and click submit 
     D. Restart CF services. 
Step 5) Use them like any other java object with <CFObject /> or CreateObject() 
     MyObj = CreateObject("java","com.foo.bar.MyObject"); 
     Remember that you can CFDump the object to see the available methods. 
     <cfdump var="#MyObj#" /> 

Votre objet de compte doit être dans les talons. Si vous avez besoin de le créer pour une raison quelconque, vous devrez le faire dans un nouveau fichier de classe Java

Généralement lorsque vous travaillez avec autant de Java, cfscript est le chemin à parcourir.

enfin, le code ressemblerait à ceci:

<cfscript> 
    // create the web service 
    ArgStruct = StructNew(); 
    ArgStruct.refreshWSDL = True; 
    ArgStruct.username = 'TestUserAccount'; 
    ArgStruct.password = '[email protected]'; 
    ws = createObject("webservice", "http://localhost/services.asmx?WSDL",ArgStruct); 


     account = CreateObject("java","com.foo.bar.Account"); 
     account.SetBaz("hello world"); 
     ws.Update(account); 
</cfscript> 
+0

J'apprécie vraiment le conseil. Entre ceci et d'autres problèmes, l'intégration a été annulée avant que j'aie essayé ceci, ainsi je ne marquerai pas comme correct (puisque je ne peux pas confirmer), mais je lui donnerai un upvote. –

1

Je suis d'accord avec la critique de ColdFusion, cependant, la solution affichée ne répond pas aussi bien aux changements wsdl.

Heureusement CF fait tout l'accès à toutes les méthodes Java sous-jacentes sur les objets. Cela inclut la "réflexion". Bien que CreateObject ne connaisse pas les objets stub, le chargeur de classe qui a créé le service Web le fait.

ws = createObject("webservice", "http://localhost/services.asmx?WSDL",ArgStruct); account = ws.getClass().getClassLoader().loadClass('com.foo.bar.Account').newInstance();

+0

Cela fonctionne parfaitement. J'avais essayé d'utiliser JavaLoader avec les fichiers .class générés et j'avais des problèmes de ClassLoader bizarres. Obtenir le classLoader à partir de l'objet webservice est un coup de génie. –

Questions connexes