Примечание: Я - 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;
}