Статьи

GlassFish 3.1.2 полон МОКСИ (EclipseLink JAXB)

Я очень рад сообщить, что EclipseLink JAXB (MOXy) теперь является поставщиком JAXB ( JSR-222 ) в GlassFish 3.1.2 . Я хотел бы поблагодарить коммиттеров EclipseLink и GlassFish за их усердную работу, чтобы это произошло.

В этом посте я расскажу, как можно использовать MOXy для создания сервиса JAX-WS. В следующих постах я расскажу больше о расширениях более подробно.

GlassFish можно скачать по следующей ссылке:



Веб-сервис (JAX-WS)

Для этого поста мы реализуем простой сервис, который находит клиента по идентификатору. Поскольку это всего лишь пример типа «Hello World», служба всегда будет возвращать клиента с именем «Jane Doe».

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package blog.jaxws.service;
 
import javax.jws.*;
import blog.jaxws.model.Customer;
 
@WebService
public class FindCustomer {
 
 @WebMethod
 public Customer findCustomer(int id) {
  Customer customer = new Customer();
  customer.setId(id);
  customer.setFirstName("Jane");
  customer.setLastName("Doe");
  return customer;
 }
 
}

WEB-INF / ВС-jaxws.xml

Существует несколько способов указать MOXy в качестве поставщика JAXB. Я предпочитаю использовать файл sun-jaxws.xml, который находится в каталоге WEB-INF .

01
02
03
04
05
06
07
08
09
10
<?xml version="1.0" encoding="UTF-8"?>
<endpoints
    version="2.0">
    <endpoint
        name='FindCustomer'
        implementation='blog.jaxws.service.FindCustomer'
        url-pattern='/FindCustomerService'
        databinding='eclipselink.jaxb'/>
</endpoints>

модель

Когда MOXy указан как поставщик JAXB, мы можем использовать все его расширения отображения. В этом примере мы будем использовать @XmlPath для отображения на основе XPath .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package blog.jaxws.model;
 
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
 
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"firstName", "lastName"})
public class Customer {
 
 @XmlAttribute
 private int id;
 
 @XmlPath("personal-info/first-name/text()")
 private String firstName;
  
 @XmlPath("personal-info/last-name/text()")
 private String lastName;
 
 public int getId() {
  return id;
 }
 
 public void setId(int id) {
  this.id = id;
 }
 
 public String getFirstName() {
  return firstName;
 }
 
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 
 public String getLastName() {
  return lastName;
 }
 
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 
}

WSDL

Ниже приведен WSDL, созданный для этой службы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2-b13 (branches/2.2-6964; 2012-01-09T18:04:18+0000) JAXWS-RI/2.2.6-promoted-b20 JAXWS/2.2 svn-revision#unknown. -->
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2-b13 (branches/2.2-6964; 2012-01-09T18:04:18+0000) JAXWS-RI/2.2.6-promoted-b20 JAXWS/2.2 svn-revision#unknown. -->
    <types>
        <xsd:schema>
            <xsd:import namespace="http://service.jaxws.blog/" schemaLocation="http://www.example.com:8080/Blog-JAXWS2/FindCustomerService?xsd=1"/>
        </xsd:schema>
    </types>
    <message name="findCustomer">
        <part name="parameters" element="tns:findCustomer"/>
    </message>
    <message name="findCustomerResponse">
        <part name="parameters" element="tns:findCustomerResponse"/>
    </message>
    <portType name="FindCustomer">
        <operation name="findCustomer">
            <input wsam:Action="http://service.jaxws.blog/FindCustomer/findCustomerRequest" message="tns:findCustomer"/>
            <output wsam:Action="http://service.jaxws.blog/FindCustomer/findCustomerResponse" message="tns:findCustomerResponse"/>
        </operation>
    </portType>
    <binding name="FindCustomerPortBinding" type="tns:FindCustomer">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
            <operation name="findCustomer">
                <soap:operation soapAction=""/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
        </operation>
    </binding>
    <service name="FindCustomerService">
        <port name="FindCustomerPort" binding="tns:FindCustomerPortBinding">
            <soap:address location="http://www.example.com:8080/Blog-JAXWS/FindCustomerService"/>
        </port>
    </service>
</definitions>

XML-схема

Ниже приведена схема XML, на которую ссылается WSDL, созданный для модели. Обратите внимание, как он включает элемент «personal-info», который был указан в аннотации @XmlPath .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is
 Metro/2.2-b13 (branches/2.2-6964; 2012-01-09T18:04:18+0000) JAXWS-RI/2.2.6-promoted-b20
 JAXWS/2.2 svn-revision#unknown. -->
 targetNamespace="http://service.jaxws.blog/">
 <xsd:complexType name="findCustomerResponse">
  <xsd:sequence>
   <xsd:element name="return" type="ns0:customer" minOccurs="0" />
  </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="findCustomer">
  <xsd:sequence>
   <xsd:element name="arg0" type="xsd:int" />
  </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="customer">
  <xsd:sequence>
   <xsd:element name="personal-info" minOccurs="0">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name="first-name" type="xsd:string"
       minOccurs="0" />
      <xsd:element name="last-name" type="xsd:string"
       minOccurs="0" />
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element>
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:int" use="required" />
 </xsd:complexType>
 <xsd:element name="findCustomerResponse" type="ns0:findCustomerResponse" />
 <xsd:element name="findCustomer" type="ns0:findCustomer" />
</xsd:schema>

Запрос на обслуживание

Вот как выглядит запрос к нашему сервису:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
    <S:Header/>
    <S:Body>
        <ns2:findCustomer xmlns:ns2="http://service.jaxws.blog/">
            <arg0>123</arg0>
        </ns2:findCustomer>
    </S:Body>
</S:Envelope>

Ответ службы

В ответе используется аннотация @XmlPath, которую мы использовали в классе Customer для сопоставления свойств firstName и lastName с XML.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
    <S:Body>
        <ns0:findCustomerResponse xmlns:ns0="http://service.jaxws.blog/">
            <return id="123">
                <personal-info>
                    <first-name>Jane</first-name>
                    <last-name>Doe</last-name>
                </personal-info>
            </return>
        </ns0:findCustomerResponse>
    </S:Body>
</S:Envelope>

Дальнейшее чтение

Если вам понравился этот пост, то вас могут заинтересовать:

Ссылка: GlassFish 3.1.2 полон MOXy (EclipseLink JAXB) от нашего партнера JCG Блеза Дафана из блога Java XML & JSON Binding .