В предыдущем посте я рассказал о том, как EclipseLink JPA-RS можно использовать для представления модуля персистентности JPA в качестве службы RESTful. В этом примере мы взаимодействовали с форматами сообщений по умолчанию. Поскольку JPA-RS использует MOXy для привязки XML и JSON, мы можем использовать MOXy для настройки сообщений. В этом посте я покажу, как это делается.
Мы могли бы применить метаданные 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>
При использовании 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"
}
}
]
}
}
]