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 のゲッターとセッターを認識しますが、プログラムを実行しようとすると、すべてのゲッターが 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

私が見つけて問題を解決したもの:

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 に答える
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 に答える