Mappen von Objektmethoden bei SOAP

Status
Nicht offen für weitere Antworten.

K-Man

Bekanntes Mitglied
Hallo
Ich habe mittels Tomcat und Axis einen Webservice entwickelt. Alles funktioniert auch ohne Probleme.
In der deploy.wsdd stehen alle meine Methoden und Objekte. Es gibt zB ein Objekt Test mit der Methode getValue() und der Membervariable value.

Wenn ich jetzt mit einem C#-Client ein Testobjekt erzeuge, dann kann ich nur auf das Feld value zurückgreifen, aber nicht die Methode aufrufen. Kann mir jemand erklären warum? Muss ich in der deploy.wsdd zu den Objekten noch zusätzlich die "freigegebenen" Methoden angeben?

Danke
Stefan
 
Wie erstellst du die Service-Schicht in C#? Mit wsdl.exe?

Für jeden Getter und Setter deiner Value-Objekte werden in C# Properties und die dazugehörigen
Membervariablen generiert. Das entspricht den Getter-/Setter-Methoden in Java.
 
Ich hab Visual Studio Express für C#. Ich füge den Service als Webverweis hinzu, so kann ich auf die Methoden zugreifen. Liefert eine Methode aber zb ein Objekt vom Typ Test zurück, dann kann ich nur auf die Member von Test zugreifen, nicht aber auf die Methoden. Es geht also nicht direkt um die Servicemethoden, sondern um evtl Objekte, die mir diese Sevicemethoden zurückliefern.
 
Welche Methoden vermisst du dort?
Wie ich schon schrieb, jeder Getter und Setter wird zu einer Membervariablen und einem Property.

z.B.
Code:
public class Person
{
   private Long id;
   private String vorname;
   private String nachname;

   public Person()
   {
   }

   public Long getId()
   {
      return id;
   }

   public void setId(Long id)
   {
      this.id = id;
   }

   ... usw. mit den anderen Getter und Setter Methoden

}
wird in WSDL (mit Java2wsdl generiert) zu
Code:
<xs:complexType name="Person">
   <xs:sequence>
      <xs:element minOccurs="0" name="id" nillable="true" type="xs:long"/>
      <xs:element minOccurs="0" name="nachname" nillable="true" type="xs:string"/>
      <xs:element minOccurs="0" name="vorname" nillable="true" type="xs:string"/>
   </xs:sequence>
</xs:complexType>
und in C# wird daraus
Code:
...
public partial class Person {
        
   private System.Nullable<long> idField;
        
   private bool idFieldSpecified;
        
   private string nachnameField;
        
   private string vornameField;
        
   [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
   public System.Nullable<long> id {
      get {
         return this.idField;
      }
      set {
         this.idField = value;
      }
   }
   
   ... usw. mit anderen Properties     
}

Was fehlt?
 
Ich mache es über BeanMapping. Aber wenn ich dich richtig verstanden habe, sind alle Member meiner Klasse nicht sichtbar, außer ich schreibe Getter und Setter dazu. In diesem Fall werden diese beim C#-Client zu Membervariabeln. Gilt dies dann auch für is und has-Methoden?

Code:
  	<beanMapping qname="myNS:Test"
  			   xmlns:myNS="http://de.kiefl.testProgram"
  		languageSpecificType=
  				"java:de.kiefl.model.Test"
  	/>


Die Methoden definiere ich so:
Code:
 <parameter name="className" value="de.kiefl.testProgram.TestProgram"/>
  <parameter name="allowedMethods" value="Methode1, Methode2"/>

Ich kann nun auf die einzelnen Methoden zugreifen. Methode1 liefert mir zB das unter BeanMapping definierte Objekt Test zurück. Ich kann auch auf Test zugreifen. Aber nicht über die Methoden der Klasse, sondern direkt über die Felder. Deswegen die Frage, sind die Methoden nicht sichtbar? Muss ich sie sichtbar machen, ähnlich wie im Tag parameter name="allowedMethodes"? Aber wenn das von oben stimmt, dann würde es alles erklären.
 
K-Man hat gesagt.:
Ich mache es über BeanMapping. Aber wenn ich dich richtig verstanden habe, sind alle Member meiner Klasse nicht sichtbar, außer ich schreibe Getter und Setter dazu. In diesem Fall werden diese beim C#-Client zu Membervariabeln. Gilt dies dann auch für is und has-Methoden?
Ja und Ja. Alles,was als Getter und Setter gilt, wird in C# zu Property.

K-Man hat gesagt.:
Ich kann nun auf die einzelnen Methoden zugreifen. Methode1 liefert mir zB das unter BeanMapping definierte Objekt Test zurück. Ich kann auch auf Test zugreifen. Aber nicht über die Methoden der Klasse, sondern direkt über die Felder. Deswegen die Frage, sind die Methoden nicht sichtbar? Muss ich sie sichtbar machen, ähnlich wie im Tag parameter name="allowedMethodes"? Aber wenn das von oben stimmt, dann würde es alles erklären.
Das von dir genannte Bean-Mapping sagt mir nichts, habe in dieser Form noch nie WebServices geschrieben.
Ich arbeite i.d.R. mit Interfaces und Annotationen, wenn ich bestimmen möchte, welche Methoden sichtbar sein sollen,
welche nicht. Die wsdl-Dateien schreibt wohl kaum jemand von Hand. 😉
 
Noch eine Anmerkung. is-Getter werden in WSDL generiert, has-Getter nicht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben