2012-04-15 81 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

相关问题