Гибкая сортировка с помощью JAXB - PullRequest
2 голосов
/ 01 февраля 2012

Я надеюсь иметь гибкий способ сортировки объектов.Подробная версия для отдельных объектов и менее подробная версия для нескольких версий объектов.

Например, рассмотрим модель моего отдела:

GET / location / 1:

  <location id='1'>
    <link rel="self" href="http://example.com/locations/1"/>
    <link rel="parent" href="http://example.com/serviceareas/1"/>
    <name>location 01</name>
    <departments>
      <department id='1'>
        <link rel="self" href="http://example.com/departments/1"/>
        <name>department 01</name>
      </department>
      <department id='2'>
        <link rel="self" href="http://example.com/departments/2"/>
        <name>department 02</name>
      </department>
      <department id='3'>
        <link rel="self" href="http://example.com/departments/3"/>
        <name>department 03</name>
      </department>
    </departments>
  </location>

GET / отдел / 1:

<department id='1'>
  <link rel="self" href="http://example.com/departments/1"/>
  <link rel="parent" href="http://example.com/locations/1"/>
  <name>department 01</name>
  <abbr>dept 01</abbr>
  ....
  <specialty>critical care</specialty>
</department>

Есть ли способ сделать это?Нужно ли мне иметь отдельные объекты?Один, который ссылается на таблицу для операций CRUD, а другой - на списки?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Примечание: Я - EclipseLink JAXB (MOXy) , и член JAXB 2 (JSR- 222) экспертная группа.

Ваш вопрос помечен EclipseLink, если вы используете EclipseLink JAXB (MOXy) , вы можете воспользоваться внешним документом привязки, чтобы применить второе сопоставление к классу Department.

<Ч />

ContextResolver

В среде JAX-RS вы можете использовать внешний связывающий документ MOXy через ContextResolver:

import java.io.*;
import java.util.*;     
import javax.ws.rs.Produces;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

@Provider
@Produces({"application/xml", "application/json"})
public class DepartmentContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext jc;

    public DepartmentContextResolver() {
        try {
            Map<String, Object> props = new HashMap<String, Object>(1);
            props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "example/bindings.xml");
            jc = JAXBContext.newInstance(new Class[] {Department.class} , props);
        } catch(JAXBException e) {
            throw new RuntimeException(e);
        } 
    }

    public JAXBContext getContext(Class<?> clazz) {
        if(Department.class == clazz) {
            return jc;
        }
        return null;
    }


} 

Для получения дополнительной информации


Внешний обязательный документ

По умолчанию внешний связывающий документ MOXy используется для дополнения аннотированной модели, но если вы установите флаг xml-mapping-metadata-complete, он полностью переопределит аннотации, позволяя вам применять совершенно другое отображение:

<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="example"
    xml-mapping-metadata-complete="true">
    ...
</xml-bindings>

Для получения дополнительной информации

UPDATE

Это обновление предназначено для ответа на ряд вопросов, которые вы задали в одном из ваших комментариев:

1. Должен ли / может ли каждый ContentResolver иметь свой собственный файл привязки?

Да, каждый ContextResolver должен иметь свой собственный файл привязки. Основной причиной введения нового ContextResolver является представление вторичного сопоставления.

2. Могу ли я иметь более одного для каждого ContentResolver (это дало бы мне несколько визуализаций одного и того же класса, создавая «вид»), возможно, указав его местоположение в конструкторе?

Для одного ContextResolver вы можете выразить метаданные в нескольких файлах привязки, но они будут объединены в один набор отображений. Это означает, что один ContentResolver не может иметь несколько представлений одного класса. Отдельный ContextResolver используется для представления вторичного отображения.

3. Где должны храниться файлы привязки?

Я рекомендую загрузить файл метаданных из пути к классам.

4. Я могу видеть, как ContentResolver может быть легко указан в методе GET Ресурса, но как это сделать, если объект внедрен в другой (JPA) объект? Во встроенном объекте getter / setter?

Ваша реализация JAX-RS должна взять ваш ContextResolver, потому что он помечен @Provider. ContextResolver, используемый для класса, будет зависеть от того, как вы реализуете метод getContext:

public JAXBContext getContext(Class<?> clazz) {
    if(Customer.class == clazz) {
        return jc;
    }
    return null;
}
0 голосов
/ 03 июля 2012

Вот и другая идея. Может быть плохой идеей, но довольно легко.

class Department {

    @XmlElement(required = true)
    public Link getSelf() {
        return self;
    }

    @XmlElement(required = false) // default
    public Link getParent() {
        if (verbose) {
            return parent;
        }
        return null;
    }

    @XmlElement(required = false) // default
    public String getSpecialty() {
        if (verbose) {
            return specialty;
        }
        return null;
    }

    @XmlTransient
    private boolean verbose;
}
...