Статьи

EclipseLink MOXy — поставщик JAXB в WebLogic Server 12c


Я очень рад объявить, что
EclipseLink JAXB (MOXy) теперь является поставщиком JAXB ( JSR-222 ) по умолчанию
в
WebLogic Server 12c . Я хотел бы поблагодарить коммиттеров EclipseLink и команду WebLogic за их усердную работу, чтобы это произошло.
В этом посте я расскажу, как можно использовать MOXy для создания сервиса JAX-WS. В следующих постах я расскажу больше о расширениях более подробно.


WebLogic Server 12c можно загрузить с OTN по следующей ссылке:

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

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

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;
 }

}

модель

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

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, созданный для этой службы:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is 
 JAX-WS RI 2.2.6hudson-86 svn-revision#12773. -->
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is 
 JAX-WS RI 2.2.6hudson-86 svn-revision#12773. -->
<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:7001/Blog-JAXWS/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:7001/Blog-JAXWS/FindCustomerService" />
  </port>
 </service>
</definitions>
XML-схема

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

<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is 
 JAX-WS RI 2.2.6hudson-86 svn-revision#12773. -->
<xsd:schema xmlns:ns0="http://service.jaxws.blog/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 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>

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

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

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header />
    <env:Body>
    <findCustomer xmlns="http://service.jaxws.blog/">
      <arg0 xmlns="">123</arg0>
    </findCustomer>
  </env:Body>
</env:Envelope>

Ответ службы


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

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <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>

 

От http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.html