В предыдущем посте я рассказал о том, как 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" } } ] } } ]