В этом посте я расскажу, как можно использовать MOXy для создания сервиса JAX-WS. В следующих постах я расскажу больше о расширениях более подробно.
GlassFish можно скачать по следующей ссылке:
Для этого поста мы реализуем простой сервис, который находит клиента по идентификатору. Поскольку это всего лишь пример типа «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. --> < definitions xmlns:wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp = "http://www.w3.org/ns/ws-policy" xmlns:wsp1_2 = "http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam = "http://www.w3.org/2007/05/addressing/metadata" xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns = "http://service.jaxws.blog/" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns = "http://schemas.xmlsoap.org/wsdl/" targetNamespace = "http://service.jaxws.blog/" name = "FindCustomerService" > < 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" > < 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" > </ 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. --> < 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 > < 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 > < return id = "123" > < personal-info > < first-name >Jane</ first-name > < last-name >Doe</ last-name > </ personal-info > </ return > </ ns0:findCustomerResponse > </ S:Body > </ S:Envelope > |
Дальнейшее чтение
Если вам понравился этот пост, то вас могут заинтересовать:
- EclipseLink MOXy — поставщик JAXB в WebLogic Server 12c
- Отображение на основе XPath — пример геокода
- Отображение объектов на несколько XML-схем — пример погоды
- XML-метаданные MOXy в службе JAX-RS
- JPA сущности в XML — двунаправленные отношения
Ссылка: GlassFish 3.1.2 полон MOXy (EclipseLink JAXB) от нашего партнера JCG Блеза Дафана из блога Java XML & JSON Binding .