2012-05-11 3 views
3

Я немного застрял в сценарии использования аннотаций, и я надеялся на ваш вклад.ClassNotFoundException с jaxb/annox и пользовательская аннотация

Учитывая следующую аннотацию (определяется в том же проекте наряду с ExistingCustomerValidator класс) пакет com.tktserver.constraints;

@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = { ExistingCustomerValidator.class }) 
@Documented 
public @interface ExistingCustomerMatch { 
    String message() default "{customer.notfound}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    /** 
    * @return The field 
    */ 
    String field(); 
} 

и следующие JXB настройки

<jaxb:bindings node="xsd:complexType[@name='customer']"> 
    <annox:annotate> 
     <annox:annotate 
      annox:class="com.tktserver.constraints.ExistingCustomerMatch" 
      field="electronicUserId" /> 
    </annox:annotate> 
</jaxb:bindings> 

Я получаю это когда я произвожу мои источники через Maven (весь проект обрабатывается им)

Caused by: org.jvnet.annox.annotation.AnnotationClassNotFoundException: Annotation class [com.tktserver.constraints.ExistingCustomerMatch] could not be found. 
    ... 32 more 
Caused by: java.lang.ClassNotFoundException: com.bgc.ticketserver.constraints.ExistingCustomerMatch 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at org.jvnet.annox.parser.XAnnotationParser.parse(XAnnotationParser.java:76) 
    ... 31 more 

Другие JSR-303 аннотация, кажется, работает нормально. Я задаюсь вопросом, попадает ли я в зависимость от циклической зависимости, например, сначала запускаются источники-источники, а затем компилируются, поэтому нет класса аннотации ExistingCustomerMatch, доступного при запуске источников-источников или же это совершенно другой зверь.

Спасибо, Иоаннис

+0

Привет, вы когда-нибудь разрешали это? –

+0

Да, я закончил тем, что построил его как зависимость от основного проекта. – Ioannis

ответ

1

Я получил свой плагин annox JAXB, работающий с xjc, используя плагин antrun в maven с org.jvnet XJC2Task против maven.compile.classpath. (см. http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Task) Не мог заставить его работать с прямыми плагинами maven.

Но это не значит, что я пришел сюда, чтобы написать. Я предполагаю, что вы приземлились здесь, потому что вы очень умны в своих поисковых процессах Google, и вы решительно настроены выбраться из какого-то адмирала JAXB через эту вещь annox. Со смирением я пишу вам, я снова был с вами снова и снова. И я обращаюсь к вам сегодня, чтобы сказать: стоп изо всех сил, вы делаете это неправильно

Мой совет для тех, кто в момент их личных «компилировать-XSD-к-JAXB-бобах» где желание состоит в добавлении аннотаций к вашим сгенерированным компонентам JAXB по пути annox или что-то еще. Если вы там, то вы можете чувствовать себя ограниченным и затрудненным ограничениями XSD, или ваши XSD могут выйти из-под контроля.

Мой опыт создания моей XML-схемы в компонентах JAXB был очень хорош для начала, было приятно видеть, что все эти pojos появляются, и все мои схемы были прекрасно представлены с разными пространствами имен и импортированы в один мастер XSD. Моя сборка была действительно ясна. Я обнаружил, что пытаюсь добавить ярлыки документации Javadoc повсюду, и мои XSD становятся все более сложными. Но мои сгенерированные бобы были очень хороши, и я освободил Джавадоков из сделки. Я должен был добавить некоторые аннотации JAXB (главным образом, @XMLTransient), и единственный способ заставить annox работать в maven для меня - использовать плагин antrun с hacky Ant task, я был недоволен этим kludge. Я думал, почему эти вещи просто не работают?

Затем все больше и больше требований вынуждали меня в более жесткие и жесткие углы с моим дизайном схемы, и я тратил все больше времени на взлом XSD - до момента прерывания: я должен был иметь возможность маршалировать JSON, используя EclipseLink MOXy, и внезапно моя схема не могла быть скручена в этот крендель и получить оба привлекательных JSON и XML. Я застрял и долгое время.

Я посоветовался с экспертом, и он сказал мне полностью отказаться от усилий, связанных с моей схемой-JAXB-бобами. Правильный путь - это вручную написать мои бобы JAXB с аннотациями JAXB и MOXy, а затем использовать схему для генерации моего .xsd. Идите в другом направлении !? Это сработало. Мои создаваемые с помощью схемы .xsd были некрасивыми, но кто это волнует, это сработало! Схема была правильной для моих бобах, и это просто все работало, когда я разбирал XML и с MOXy, я мог собрать мои бобы в JSON.

Чтобы преобразовать мой код, я даже использовал свои исходные сгенерированные компоненты JAXB, которые у меня были из моей рукописной схемы в качестве отправной точки, поэтому мне даже не нужно начинать с нуля. Фактически, я выбросил более половины моих сгенерированных бобов JAXB; они были излишними (xjc генерирует тонну отбрасывающих классов). Лучшая часть теперь я знаком с MOXy-аннотациями. Используйте MOXy в качестве вашего провайдера для всего, полностью прекратите использование встроенного Oracle JAXB impl. MOXy - будущее JAXB.

Итак, я надеюсь, что это доставит вам бедные души, пытающиеся сделать работу XJC. Надеюсь, вы перестанете страдать от скручивания кренделя. Это не займет у вас много времени, чтобы внести изменения, просто сделайте это.

+1

Возвращаясь к этим 3 годам вниз по линии, мудрее и серому, я должен был отказаться от нее в соответствии с вашими предложениями :). В настоящее время, когда генерируется генерация схемы, я больше сторонник JSON Schema, так как это приносит мне * много * ближе к конечному результату с гораздо меньшими усилиями. – Ioannis

+0

@loannis Sigh. Да, еще 3 года под мостом. Подобно вам, я ничего не делаю с XML. JSON - это lingua franca, и я тоже пишу много JSON Schema, чтобы выполнить мою работу. fge для подтверждения контракта, Джерси для строительных услуг, валидатор фасовки спящего режима для сложных правил. Технология - это дерьмо, она одновременно лучше и хуже, чем XSD, WSDL, JAX-WS sh-show. Я готов к следующей лингва-франке, и, надеюсь, у нее будет меньше пощечин и более резкое оснащение. Я пытаюсь получить бай-ин от своих сверстников, чтобы использовать буферы протокола Google, но удачи в этом. – DWoldrich

0

Эта задача была решена путем создания отдельного модуля Maven для валидаторов и использовать его в качестве зависимости в основном проекте.