WebサービスのパラメータをBeanにする

mabushiisign

今まで作成したWebサービスのパラメータは、Stringだったが、Java Beanにすることも出来る。
まぁ、これが出来なかったら使えない。
今回、例としてname, age, Organizationを持つPersonクラスと、nameとaddressを持つ、Organizationクラスを定義する。

1package sample.model;
2 
3import javax.xml.bind.annotation.XmlElement;
4 
5public class Person {
6 
7    private String name;
8    private int age;
9    private Organization work;
10 
11    public String getName() {
12        return name;
13    }
14    public void setName(String name) {
15        this.name = name;
16    }
17    public int getAge() {
18        return age;
19    }
20    public void setAge(int age) {
21        this.age = age;
22    }
23    @XmlElement(name="previousWork")
24    public Organization getWork() {
25        return work;
26    }
27    public void setWork(Organization work) {
28        this.work = work;
29    }
30}
1package sample.model;
2 
3import javax.xml.bind.annotation.XmlElement;
4 
5public class Organization {
6 
7    private String name;
8    private String address;
9 
10    public String getName() {
11        return name;
12    }
13    public void setName(String name) {
14        this.name = name;
15    }
16    @XmlElement(nillable=true)
17    public String getAddress() {
18        return address;
19    }
20    public void setAddress(String address) {
21        this.address = address;
22    }
23}

サービスとしては、Personを引数にとるattendメソッドを持つ、Meetingクラスを用意する。

1package sample.webservice;
2 
3import javax.jws.WebMethod;
4import javax.jws.WebService;
5 
6import sample.model.Person;
7 
8@WebService
9public class Meeting {
10 
11    @WebMethod
12    public String attend(Person person) {
13        String message;
14 
15        message = person.getName() + "(" + person.getWork().getName() + ")の参加を受付けました。";
16        return message;
17 
18    }
19}

この場合でも、何の問題なくWebサービスは作成可能である。
また、Beanのgetterに@XmlElementアノテーションを設定している。
そうすることで、WSDLのXMLのパラメータ名や属性を設定することが出来る。
出来たWSDLは以下の通り。

1<definitions name='MeetingService' targetNamespace='http://webservice.sample/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://webservice.sample/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
2 <types>
3  <xs:schema targetNamespace='http://webservice.sample/' version='1.0' xmlns:tns='http://webservice.sample/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
4   <xs:element name='attend' type='tns:attend'/>
5   <xs:element name='attendResponse' type='tns:attendResponse'/>
6   <xs:complexType name='attend'>
7    <xs:sequence>
8     <xs:element minOccurs='0' name='arg0' type='tns:person'/>
9    </xs:sequence>
10   </xs:complexType>
11   <xs:complexType name='person'>
12    <xs:sequence>
13     <xs:element name='age' type='xs:int'/>
14     <xs:element minOccurs='0' name='name' type='xs:string'/>
15     <xs:element minOccurs='0' name='previousWork' type='tns:organization'/>
16    </xs:sequence>
17   </xs:complexType>
18   <xs:complexType name='organization'>
19    <xs:sequence>
20     <xs:element minOccurs='0' name='address' nillable='true' type='xs:string'/>
21     <xs:element minOccurs='0' name='name' type='xs:string'/>
22    </xs:sequence>
23   </xs:complexType>
24   <xs:complexType name='attendResponse'>
25    <xs:sequence>
26     <xs:element minOccurs='0' name='return' type='xs:string'/>
27    </xs:sequence>
28   </xs:complexType>
29  </xs:schema>
30 </types>
31 <message name='Meeting_attend'>
32  <part element='tns:attend' name='attend'></part>
33 </message>
34 <message name='Meeting_attendResponse'>
35  <part element='tns:attendResponse' name='attendResponse'></part>
36 </message>
37 <portType name='Meeting'>
38  <operation name='attend' parameterOrder='attend'>
39   <input message='tns:Meeting_attend'></input>
40   <output message='tns:Meeting_attendResponse'></output>
41  </operation>
42 </portType>
43 <binding name='MeetingBinding' type='tns:Meeting'>
44  <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
45  <operation name='attend'>
46   <soap:operation soapAction=''/>
47   <input>
48    <soap:body use='literal'/>
49   </input>
50   <output>
51    <soap:body use='literal'/>
52   </output>
53  </operation>
54 </binding>
55 <service name='MeetingService'>
56  <port binding='tns:MeetingBinding' name='MeetingPort'>
57   <soap:address location='http://localhost:8080/WebSample/services/Meeting'/>
58  </port>
59 </service>
60</definitions>

PersonのgetWorkに「@XmlElement(name=”previousWork”)」を設定しているため、「」となっている。
また、OrganizationのgetAddressに「@XmlElement(nillable=true)」を設定しているため「」となっている。
これらのアノテーションの設定については、JAXB(Java Architecture for XML Binding)というJavaのオブジェクトからXMLにシリアライズ、XMLからJavaのオブジェクトをデシリアライズする仕組みを使用している。
詳細は以下を参照。
http://www.jcp.org/en/jsr/detail?id=222

では、クライアント側はどうなるのかというとこちらも問題ない。
Javaソースを生成すると、Personクラス、Organizationクラスも生成されるため、問題なく開発が可能である。

ABOUT ME
mabushiisign
mabushiisign
B'zとdoaとミスチルと登山が好きな40代のプログラマです。 普段は、SIer企業で働いています。
記事URLをコピーしました