2012-04-15 14 views
1

Ich verwende Netbeans, um ein Webanwendungsprojekt zu erstellen. Die IDE fügt METRO2.0-Bibliotheken hinzu, wenn ich einen neuen Webdienst erstelle (Code zuerst WS). Der SOAP-Webdienst ist in meinem Apache Tomcat 6 gut implementiert. Wenn ich jedoch einen komplexen Typ sende, konnte der Client nicht auf die Methoden des gesendeten Objekts im Client zugreifen. Sagen wir, ich habe eine Klasse Person und eine Operation genannt:Machen Sie die Methoden eines über SOAP gesendeten Objekts sichtbar

@WebMethod(operationName = "getOnePerson") 
    public Person getOnePerson() { 

     return new Person("MyName", "MySurname", 24); 
    } 

und die Person Klasse:

public class Person { 

    private String name, surname; 
    private int age; 

    public Person() { 

    } 
    public Person(String name, String surname, int age) { 
     this.name = name; 
     this.surname = surname; 
     this.age = age; 
    } 

    public int getAge() { 
     return age; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getSurname() { 
     return surname; 
    } 
} 

Wie kann ich den Client kennen die Person Methoden machen? Dank EDIT: Ich habe versucht, meine XSD-Datei zu aktualisieren, indem Pesron Attribute hinzufügen:

<xs:complexType name="person"> 
     <xs:attribute name="name" type="xs:string" /> 
     <xs:attribute name="surname" type="xs:string" /> 
     <xs:attribute name="age" type="xs:int" /> 
    </xs:complexType> 

Durch diesen Teil hinzufügen, kennt der Client die Getter & Setter der Klasse Person, aber wenn man versucht, das Programm auszuführen, alle Getter null zurück (Client-Seite):

public class Main { 

    public static void main(String[] args) { 

     try { 
      Person p = getOnePerson(); 
      System.out.println(p); 
      System.out.println(p.getSurname()); 
      System.out.println(p.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static Person getOnePerson() { 
     com.company.ws.BeanWebService_Service service = new com.company.ws.BeanWebService_Service(); 
     com.company.ws.BeanWebService port = service.getBeanWebServicePort(); 
     return port.getOnePerson(); 
    } 
} 

Rückkehr: [email protected] null null Könnten Sie mir bitte sagen, warum der Client die verschiedenen Werte des Klassenattributs nicht kennt?

+0

Ich kann die Klassen auf den Client kopieren. Aber kann die JVM den Adressspeicher jedes Attributs auflösen? Tatsächlich erstellt der Client automatisch einen neuen Typ namens com.company.ws.Person, in dem keine Methoden vorhanden sind. Das Erstellen einer anderen Klasse mit demselben Namen kann daher zu Problemen führen. Ist es nicht? –

Antwort

0

Was ich gefunden habe, und löst das Problem:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType (name = "Person", propOrder = {"name","surname", "age"}) 
public class Person { 
    @XmlElement(name="name",required = true) 
    private String name; 

    @XmlElement(name="surname",required = true) 
    private String surname; 

    @XmlElement(name="age",required = true) 
    private int age; 

//GETTER & SETTER 
} 

Thank you!

0

Als JAX-WS JAXB verwendet/Abstellungs Objekte Marschall, empfehle ich:

  • eine XSD für Person definieren
  • erzeugen die JAXB Klassen dieser XSD
  • die erzeugte Klasse Person als die Verwendung Rückgabetyp Ihres Web Service

Wenn Sie mit Maven (sehr zu empfehlen), dann können Sie das folgende Plugin verwenden, um die JAXB-Klassen aus einem XSD zu generieren:

 <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>0.8.1</version> 
      <executions> 
       <execution> 
        <id>generate</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <generatePackage>com.yourcompany.somecomponent.somepackage.jaxb</generatePackage> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Expected XSD & XJB (JAXB Anpassungsdateien) Standort: src/main/resources

+0

OK, wie ich verstehe, wird die Xsd-Datei das Mapping mit der Client-Klasse tun. Ist es nicht?Ich habe ein Beispiel für das Senden einer HashMap KEY1 VALUE1 TASTE2 VALUE2 in http://www.coderanch.com/ mit gefunden t/415853/Web-Services/Java/JAXB-Mapping-HashMap. Ist es das was du meinst? –

+0

Das XSD spezifiziert die Datenstrukturen Ihres Web Service in einer Programmiersprachen neutralen Weise. JAXB ermöglicht es, Java-POJOs zu/von XML-Dokumenten, die der XSD entsprechen, zu marshalieren/unmarshalen. Sie haben also immer noch eine Personenklasse, die der von Hand geschriebenen ähnlich ist, keine HashMap. – Puce

+0

Danke für Ihre Erklärung. Ich habe festgestellt, dass die IDE bereits eine xsd-Datei generiert hat, um den WS zuzuordnen. Wie ich es verstehe, muss ich diese Datei ändern, um die Person-Objekte zuzuordnen. http://hpics.li/2686848 –

Verwandte Themen