Amazon EC2にPayara Serverをインストールする
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クラスも生成されるため、問題なく開発が可能である。