Статьи

Настройка сообщений EclipseLink JPA-RS с помощью MOXy

В предыдущем посте я рассказал о том, как EclipseLink JPA-RS можно использовать для представления модуля персистентности JPA в качестве службы RESTful. В этом примере мы взаимодействовали с форматами сообщений по умолчанию. Поскольку JPA-RS использует MOXy для привязки XML и JSON, мы можем использовать MOXy для настройки сообщений. В этом посте я покажу, как это делается.

МОКСИ метаданные (oxm.xml)

Мы могли бы применить метаданные MOXy через аннотации непосредственно к сущностям JPA, но в этом посте мы будем использовать внешний картографический документ MOXy. В документе сопоставления мы укажем порядок для наших свойств (строка 7) и применим сопоставление на основе пути (строки 9-16).

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="org.example">
    <java-types>
        <java-type name="Customer">
            <xml-type prop-order="id firstName lastName address phoneNumbers"/>
            <java-attributes>
                <xml-element java-attribute="firstName"
                    xml-path="personal-info/first-name/text()"/>
                <xml-element java-attribute="lastName" 
                    xml-path="personal-info/last-name/text()"/>
                <xml-element java-attribute="address"
                    xml-path="contact-info/address"/>
                <xml-element java-attribute="phoneNumbers"
                    xml-path="contact-info/phone-numbers"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Ссылка на метаданные MOXy (persistence.xml)

При использовании JPA-RS мы можем ссылаться на наш внешний документ отображения
MOXy, используя свойство eclipselink.jpa-rs.oxm в файле JPA persistence.xml (строка 21).

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="CustomerService" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>CustomerService</jta-data-source>
        <class>org.example.Customer</class>
        <class>org.example.Address</class>
        <class>org.example.PhoneNumber</class>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="FINEST" />
            <property name="eclipselink.logging.level.ejb_or_metadata" value="WARNING" />
            <property name="eclipselink.logging.timestamp" value="false"/>
            <property name="eclipselink.logging.thread" value="false"/>
            <property name="eclipselink.logging.session" value="false"/>
            <property name="eclipselink.logging.exceptions" value="false"/>
            <property name="eclipselink.target-server" value="SunAS9"/>
            <property name="eclipselink.jpa-rs.oxm" value="org/example/oxm.xml"/>
        </properties>
    </persistence-unit>
</persistence>

Сохранение сущности

Мы будем использовать операцию POST для создания нового экземпляра объекта
Customer .

ПОЧТА

URI для нашей операции POST остается тем же, что и до того, как мы настроили метаданные MOXy (см.
Введение в EclipseLink JPA-RS ).

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer

Запрос 

Отправляемые нами данные были изменены в соответствии с новыми метаданными сопоставления.
Теперь данные вложены в
узлы
personal-info (строка 3) и
contact-info (строка 7).

{
    "id" : 1,
    "personal-info" : {
        "firstName" : "Jane",
        "lastName" : "Doe"
    },
    "contact-info" : {
        "address" : {
            "id" : 1,
            "street" : "1 A Street",
            "city" : "Any Town"
        },
        "phone-numbers" : [{
            "id" : 2,
            "type" : "work",
            "num" : "555-1111"
         }, {
            "id" : 3,
            "type" : "home",
            "num" : "555-2222"
        }]
    }
}

Выполнение запроса

JPA-RS автоматически создает URI для каждого из именованных запросов, которые мы определили в нашей модели JPA:

GET


URI для нашей операции GET остается тем же, что и до того, как мы настроили метаданные MOXy (см.
Введение в EclipseLink JPA-RS ).

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata/entity/Customer

Ответ

Полученные нами данные были изменены в соответствии с новыми метаданными сопоставления. Порядок свойств изменился, и теперь данные вложены в
узлы
personal-info (строка 4) и
contact-info (строка 22).
 

[
    {
        "id": 1,
        "personal-info": {
            "first-name": "Jane",
            "last-name": "Doe"
        },
        "_relationships": [
            {
                "_link": {
                    "href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/1/address",
                    "rel": "address"
                }
            },
            {
                "_link": {
                    "href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/1/phoneNumbers",
                    "rel": "phoneNumbers"
                }
            }
        ],
        "contact-info": {
            "address": {
                "_link": {
                    "href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Address/1",
                    "method": "GET",
                    "rel": "self"
                }
            },
            "phone-numbers": [
                {
                    "_link": {
                        "href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/PhoneNumber/3",
                        "method": "GET",
                        "rel": "self"
                    }
                },
                {
                    "_link": {
                        "href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/PhoneNumber/2",
                        "method": "GET",
                        "rel": "self"
                    }
                }
            ]
        }
    }
]