Простой способ перейти с JAXB на Castor? - PullRequest
0 голосов
/ 28 октября 2019

Я создал библиотеку, которая включает в себя около 200 классов Java, сгенерированных из существующего XSD с JAXB, например:

xjc -no-header -d schemas -b xsd/binding.xml xsd

Увы, JAXB не поддерживается на Android, и общее предложение, по-видимому, таково:использовать другую библиотеку. Кастор кажется подходящей альтернативой, особенно потому, что он предлагает преобразование .xsd в классы Java. Однако это кажется более сложным, чем в Java, и я понятия не имею, насколько сильно результат отличается от xjc output.

Мой вариант использования - демаршалирование и чтение немаршалированных данных (изменение данных илимаршалинг не нужен). То есть существует огромное количество кода, который опирается на получающуюся схему классов Java, поэтому любая разница между xjc -генерированными классами и их аналогами Castor будет означать много рефакторинга.

Есть простойрецепт того, как сгенерировать классы Java из .xsd в Castor и получить результат, максимально приближенный к тому, что производит xjc?

1 Ответ

0 голосов
/ 30 октября 2019

Следующий подход настолько же близок, насколько я понял, хотя некоторый рефакторинг все еще требуется:

Поместите файл с именем castorbuilder.properties в путь к классам со следующим содержанием:

org.exolab.castor.builder.javaclassmapping=type
org.exolab.castor.builder.javaVersion=5.0
# Replace the following lines with your schema(s)
org.exolab.castor.builder.nspackages=\
   http://example.com/schema/foo=com.example.schema.foo,\
   http://example.org/schema/bar=org.example.schema.bar
org.exolab.castor.builder.primitivetowrapper=true

Затем выполните следующую командную строку:

java -cp "*" org.exolab.castor.builder.SourceGeneratorMain -i schema.xsd -types j2

В приведенном выше тексте замените classpath на путь к JAR-файлам Castor и castorbuilder.properties и замените schema.xsd на путь к вашему XSD-файлу.

Конечно, вы можете вызывать Castor через Ant или Maven - в этом случае обязательно используйте соответствующий эквивалент параметров командной строки, приведенных выше, и убедитесь, что файл свойств выбран.

Различия, требующие рефакторинга:

  • Типы Enum теперь находятся в своем собственном types подпакете
  • Где литералы XML Enum находятся в camelCase, теперь они становятся CAMELCASEвместо CAMEL_CASE
  • Castor генерирует свойства массива, где JAXB имеет Collection свойства
  • Некоторые имена классов получают префикс в качестве подчеркивания;очевидно, JAXB удаляет их, в то время как Castor сохраняет их
  • Поля даты теперь Date экземпляры
  • В одном случае свойство изменило свое имя с value на content

Однако - похоже, что в Castor есть ошибка, так как некоторые из сгенерированных классов вызывают несуществующий конструктор . Это помешало мне успешно испытать это;Я дошел до рефакторинга моего существующего кода до такой степени, что он свободен от синтаксических ошибок и ошибок компилятора.

...