1

我正在使用 Netbeans 创建一个 Web 应用程序项目。当我创建新的 Web 服务(代码优先 WS)时,IDE 会添加 METRO2.0 库。SOAP Web 服务很好地部署在我的 apache Tomcat 6 中。但是,当我发送复杂类型时,客户端无法访问客户端中发送对象的方法。假设我有一个名为Person的类和一个操作:

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

那么如何让客户知道Person方法呢?谢谢编辑:我试图通过添加 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 和 setter,但是当尝试运行程序时,所有的 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();
    }
}

返回: com.company.ws.Person@d75415 null null 那么你能告诉我为什么客户端不知道类属性的不同值吗?

4

2 回答 2

0

由于 JAX-WS 使用 JAXB 来编组/解组对象,我建议:

  • 为 Person 定义一个 XSD
  • 生成此 XSD 的 JAXB 类
  • 使用生成的 Person 类作为 Web 服务的返回类型

如果您使用的是 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/main/resources

于 2012-04-15T12:01:44.267 回答
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
}

谢谢!

于 2012-05-06T23:02:31.070 回答