2012-04-15 27 views
1

我正在使用Netbeans創建Web應用程序項目。當我創建一個新的Web服務(代碼第一個WS)時,IDE添加METRO2.0庫。 SOAP web服務已經部署在我的apache Tomcat 6中。但是,當我發送複雜類型時,客戶端無法訪問客戶端中發送的對象的方法。 說我有一個名爲類和操作:使通過SOAP發送的對象的方法可見

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

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

而Person類:

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; 
    } 
} 

那麼請問有什麼可以讓客戶知道的方法呢? 感謝 編輯:我已經嘗試通過增加Pesron的屬性來更新我的XSD文件:

<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> 

通過添加此部分,客戶端知道Person類的吸氣&二傳手,但試圖運行程序的時候,所有的getter方法返回null(客戶端):

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(); 
    } 
} 

回報: [email protected] 空 空 那麼你能否告訴我爲什麼客戶不知道類屬性的不同值?

+0

我可以將類複製到客戶端。但是JVM能夠解析每個屬性的地址內存嗎?實際上,客戶端會自動創建一個名爲com.company.ws.Person的新類型,其中沒有方法。因此創建具有相同名稱的另一個類可能會導致一些問題。不是嗎? – 2012-04-15 11:54:02

回答

0

我發現和解決問題:

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 
} 

謝謝!

0

作爲JAX-WS使用JAXB編組/解組對象,我建議:

  • 限定XSD用於人
  • 生成此XSD
  • 使用生成的人類作爲的JAXB類返回類型Web Service的

如果你使用Maven的(強烈推薦),那麼你可以使用下面的插件從XSD生成JAXB類:

 <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> 

預期XSD & XJB(JAXB自定義文件)位置:SRC /主/資源

+0

好的,據我所知,xsd文件將執行與客戶端類的映射。不是嗎?我發現一個例子在http://www.coderanch.com/發送使用 KEY1 VALUE1 KEY2 VALUE2 一個HashMap T/415853 /網絡服務/ JAVA/JAXB映射,HashMap中。你是這個意思嗎? – 2012-04-15 12:09:39

+0

XSD以編程語言中立的方式指定Web Service的數據結構。 JAXB允許將Java POJO編組/解組爲符合XSD的XML文檔。所以你仍然會有一個Person類,類似於你手寫的那個,而不是一個HashMap。 – Puce 2012-04-15 12:13:09

+0

感謝您的解釋。我發現IDE已經生成了一個xsd文件來映射WS。據我所知,我必須修改這個文件來映射Person對象。 http://hpics.li/2686848 – 2012-04-15 12:26:29

相關問題