2012-05-11 106 views
3

我有點卡住註釋使用場景,我希望你的輸入。ClassNotFoundException與jaxb/annox和自定義註釋

給出的以下注釋 包com.tktserver.constraints(在相同的項目與ExistingCustomerValidator類沿着所定義的);

@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我的消息來源註釋似乎工作正常。我想知道的是,我是否被循環依賴關係困在此處,即generate-sources先運行,然後編譯,因此在運行generate-sources時不存在ExistingCustomerMatch註釋類,或者這是完全不同的野獸。

感謝, 揚

+0

嗨,你有沒有解決這個問題? –

+0

是的,我最終把它建立爲主項目的依賴關係 – Ioannis

回答

1

我通過使用maven中的antrun插件與maven.compile.classpath中的org.jvnet XJC2Task,得到了我的annox JAXB插件,它使用xjc工作。 (請參閱http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Task)永遠無法使用直接的Maven插件。

但這不是我來這裏寫作的原因。我猜你是在這裏登陸的,因爲你對Google的搜索非常聰明,而且你堅定地決心通過這個annox的東西走出你的任何JAXB地獄。我以謙遜的態度寫信給你,我一次又一次地陪着你。而我今天給您寫信說:停止掙扎,你就錯了

我的建議是對於那些誰是他們個人的「編譯XSD到JAXB的豆」點冒險,其中的願望是通過annox或其他任何方式向生成的JAXB bean添加註釋。如果你在那裏,那麼你可能會受到XSD限制的束縛和束縛,或者你的XSD可能會失控。

將我的XML Schema構建到JAXB bean中的經驗非常好,我很高興看到所有這些pojos出現,並且我的模式都用不同的名稱空間很好地分解並導入到一個主XSD中。我的構建非常清晰。我發現自己試圖在任何地方添加Javadoc文檔標籤,我的XSD變得越來越複雜。但我生成的豆子非常好看,我得到了免費的Javadocs。我不得不放入一些JAXB註釋(主要是@XMLTransient),唯一能讓我在maven中工作的唯一方法就是使用antrun插件和hacky Ant任務,我對那個kludge感到不滿。我想,爲什麼這些東西不能正常工作?

隨着越來越多的要求,我用我的模式設計迫使我進入更緊密更緊密的角落,並且我花費越來越多的時間來攻擊XSD - 直到突破點:我必須能夠使用EclipseLink MOXy對JSON進行編組,突然間我的模式不能被扭曲成椒鹽捲餅,並且同時獲得好看的JSON和XML。我被卡住了很長時間。

我諮詢過一位專家,他告訴我完全放棄我的模式到JAXB-豆的努力。正確的做法是用JAXB和MOXy註釋手寫我的JAXB bean,然後使用schemagen生成我的.xsd。去另一個方向!?有效。我的schemagen生成的.xsd並不漂亮,但是誰在乎,它工作正常!這個模式對於我的bean來說是正確的,當我解析XML和MOXy時,它就可以工作,我可以將我的bean編組爲JSON。

爲了轉換我的代碼,我甚至用自己的手寫模式生成的JAXB bean作爲起點,所以我甚至不需要從頭開始。事實上,我扔掉了我生成的JAXB bean的一半以上;他們是多餘的(xjc會產生大量的拋棄類)。最好的部分是現在我熟悉MOXy註釋。使用MOXy作爲您的提供者,完全停止使用內置的Oracle JAXB impl。 MOXy是JAXB的未來。

所以,我希望這可以讓你嘗試使XJC工作的可憐靈魂。我希望你會停止與你的椒鹽捲餅扭曲的痛苦。它不會花很長時間才能做出改變,只需要做。

+1

回到這3年來,明智的和灰色的,我應該按照你的建議放棄它:)。現在,當強制實施模式生成時,我更傾向於使用JSON模式,因爲它爲我帶來了更多更接近最終結果的內容,並且花費了更少的精力。 – Ioannis

+0

@loannis嘆了口氣。是的,在橋下3年。與你類似,我對XML沒有任何幫助。 JSON是通用語言,我也寫了很多JSON Schema來完成我的工作。用於合同驗證的fge模式驗證器,用於構建服務的Jersey,用於複雜規則的hibernate bean驗證器。該技術是廢話,它同時比XSD,WSDL,JAX-WS sh--更好,更糟糕。我準備好迎接下一個通用語言了,希望這樣做不會一巴掌一點,而且工具更加銳利。我試圖讓我的同行使用谷歌協議緩衝區,但祝你好運。 – DWoldrich

0

這是通過創建驗證一個單獨的Maven模塊,並用它作爲主要項目的依賴解決。