2015-10-12 2 views
1

У меня есть пара классов Java, которые я хочу преобразовать в xml с помощью jaxb. (Мне не нужно генерировать классы на основе схемы). Мне нужно сопоставить класс с разными форматами xml, поэтому я не хочу использовать аннотации. Из того, что я видел, мой лучший вариант, похоже, заключается в использовании внешних привязок xml. Поэтому я хотел бы знать:jaxb java класс для нескольких сопоставлений xml

1) Я использую затмение. Я новичок в JAXB, и мне хотелось бы знать, как интегрировать внешние привязки с помощью eclipse?

2) Какие другие варианты, кроме внешних привязок xml, доступны?

ответ

1

Я думаю, что вы лучший вариант заключается в использовании Moxy XML привязок:

Это позволяет определить XML < -> Java отображения в виде файлов XML вместо аннотации :

<?xml version="1.0" encoding="US-ASCII"?> 
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="example"> 

    <java-types> 
     <java-type name="Customer"> 
      <xml-root-element name="customer-info" /> 
      <java-attributes> 
       <xml-attribute java-attribute="custId" name="customer-id" /> 
       <xml-element java-attribute="picture" name="picture-hex"> 
        <xml-schema-type name="hexBinary" /> 
        <xml-java-type-adapter 
         value="example.adapters.MyHexConverter" /> 
       </xml-element> 
      </java-attributes> 
     </java-type> 
    </java-types> 

</xml-bindings> 

Вы можете использовать этот файл через JAXBContextProperties.OXM_METADATA_SOURCE свойства:

Map<String, Object> properties = new HashMap<String, Object>(); 
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream); 

JAXBContext ctx = JAXBContext.newInstance(new Class[] { Customer.class }, properties); 

Так что, если вы хотите несколько различных отображений для того же класса, просто написать несколько привязок XML и создать JAXBContext с соответствующими файлами. Я думаю, что это лучшие варианты прямо сейчас, с MOXy

С чистым JAXB RI вы можете написать собственный читатель аннотаций. Я сделал это один раз с Annox:

Другой вариант был JBoss JAXBIntroductions, а также на основе читателя пользовательских аннотаций:

Но я Я не уверен, что это уже живое.

Поскольку вам нужно несколько сопоставлений, вам придется писать их (все, кроме одного) вручную. Вы можете создать один набор сопоставлений в виде аннотаций, но дальнейшие сопоставления должны быть записаны вручную. Или, допустим, я не знаю о плагине или инструменте, который генерирует, например, MOXy привязки XML. Не было бы большой проблемой написать одну, хотя.

Вы также можете использовать совершенно другой подход.Вместо того, чтобы сопоставлять одну центральную модель с разными отображениями/форматами, вы можете отобразить в этих форматах отдельный пакет DTO. А затем конвертируйте между DTO и центральной моделью. Что-то вроде

XML(1) <-> DTO(1)|<-\ 
XML(2) <-> DTO(2)|<--*->Model 
XML(3) <-> DTO(3)|<-/ 

Таким образом, вы будете иметь чистые DTOs за формат обмена (который вы можете генерировать из схем) и единый центральный бизнес-модель (чтобы управлять ими всеми). Вам нужно будет преобразовать между DTO и Model, это можно обработать с помощью инструмента, такого как Dozer.

Если это лучший подход или нет, зависит от того, насколько сложны ваши форматы и насколько они отличаются друг от друга.

Что касается ваших вопросов:

1) Там нет ничего особенного Eclipse, просто добавьте Moxy в зависимости и следовать документации.
2) Я описал несколько вариантов выше.

+0

Да, с того момента, когда я раньше смотрел JBoss, он казался устаревшим и полезным в течение времени, когда JAXB не поддерживал внешние привязки. Я пробовал первый подход с MOXy. Однако я столкнулся с некоторыми проблемами, в которых, по-видимому, не принимается обязательный файл. Я разместил здесь свой вопрос (http://stackoverflow.com/questions/33112876/jaxb-moxy-external-bindings-file-not-beingread). Цените это, если сможете помочь. – GenerousJoker

0
  1. См "Передача файлов настройки в JAXB Binding Compiler" здесь: https://docs.oracle.com/javase/tutorial/jaxb/intro/custom.html

Вы могли бы написать сценарий для интеграции в Eclipse. Или вы можете использовать задачу Maven или Ant.

  1. Ваши единственные варианты - аннотации или привязки XML.
+0

Файл привязки передается компилятору xjc JAXB XML Schema, и это определенно то, что OP не может сделать, поскольку он не начинается с XML-схемы. – laune

+0

@laune Извините, вы ошибаетесь. В MOXy есть «привязки XML», которые в основном заменяют аннотации в форме XML: http://www.eclipse.org/eclipselink/documentation/2.6/moxy/runtime003.htm – lexicore

+0

@lexicore Вам придется изучить это, но в этом ответе упоминается компилятор JAXB, и это было исключено OP. Поэтому ваш комментарий должен был быть направлен на мой комментарий к вопросу (который я удалил). Я поддерживаю свой комментарий к этому ответу, который не затрагивает проблему OP. – laune

Смежные вопросы