首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有jaxb/annox和自定义注释的ClassNotFoundException

带有jaxb/annox和自定义注释的ClassNotFoundException
EN

Stack Overflow用户
提问于 2012-05-11 00:53:18
回答 2查看 2.1K关注 0票数 3

我有点被一个注释使用场景困住了,我希望您的输入。

给定以下注释(与ExistingCustomerValidator类一起在同一个项目中定义),包com.tktserver.constraints;

代码语言:javascript
复制
@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自定义

代码语言:javascript
复制
<jaxb:bindings node="xsd:complexType[@name='customer']">
    <annox:annotate>
        <annox:annotate
            annox:class="com.tktserver.constraints.ExistingCustomerMatch"
            field="electronicUserId" />
    </annox:annotate>
</jaxb:bindings>

当我通过Maven生成我的源代码(整个项目都由它来处理)时,我就得到了这个结果。

代码语言:javascript
复制
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运行时没有可用的ExistingCustomerMatch注释类,还是完全不同。

谢谢你,伊奥尼斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-24 17:58:24

我通过使用maven中的antrun插件和org.jvnet XJC2Task来处理maven.compile.classpath,从而获得了使用xjc的XJC2Task插件。(参见http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Task)无法让它与直接的maven插件一起工作。

但这不是我来这里写作的原因。我猜你登陆这里是因为你对谷歌搜索非常聪明,而且你固执地决心通过这个烦人的事情摆脱JAXB地狱。我以谦卑的态度写信给你,我和你在一起一次又一次。我今天写信给你说:别再挣扎了,你做错了

我的建议是,对于那些在他们个人的“编译-xsd-到JAXB -bean”冒险中的人来说,他们的愿望是通过恼怒或其他方式向您生成的JAXB bean添加注释。如果你在那里,那么你可能会感到受到XSD的限制和束缚,或者你的XSD可能会失去控制。

首先,我将XML模式构建到JAXB bean中的经验非常好,看到所有这些pojos出现,我的模式都被不同的名称空间很好地考虑,并导入到一个主XSD中,这让我感到很高兴。我的身材很清楚。我发现自己试图在任何地方添加Javadoc文档标记,我的XSD变得越来越复杂。但是我生成的bean很好看,我从交易中获得了免费的Javadocs。我不得不输入一些JAXB注释(主要是@XMLTransient),我唯一能让它在maven中工作的方法就是使用带有hacky Ant任务的antrun插件,我对此很不满意。我想,为什么这些东西就不能正常工作?

然后,越来越多的需求迫使我在模式设计上陷入越来越紧的境地,我花了越来越多的时间对XSD进行黑客攻击--直到关键时刻:我必须能够使用EclipseLink MOXy编组到JSON,而突然之间,我的模式无法被扭曲到椒盐卷饼中,同时得到好看的JSON和XML。我被困住了很长时间。

我咨询了一位专家,他告诉我放弃我的模式到JAXB-bean的努力。正确的方法是用JAXB和MOXy注释手工编写JAXB,然后使用模式根生成..xsd。啊,真灵。我的原理图生成的..xsd不是很漂亮,但谁在乎,它成功了!每个bean的模式都是正确的,当我解析XML时,所有这些都能正常工作,使用MOXy,我可以将bean封送到JSON。

为了完成代码转换,我甚至使用了我从手写模式获得的原始JAXB作为起点,所以我甚至不需要从头开始。事实上,我扔掉了我生成的JAXB bean的一半以上;它们是多余的(xjc生成了大量的丢弃类)。最好的部分是我现在熟悉了MOXy注释。使用MOXy作为您的一切提供程序,完全停止使用内置的Oracle。MOXy是JAXB的未来。

所以,我希望这能让你们这些努力使XJC发挥作用的可怜人得到满足。我希望你不要再吃椒盐卷饼了。你不需要很长时间就能做出改变,就这么做吧。

票数 2
EN

Stack Overflow用户

发布于 2013-09-19 15:33:41

通过为验证器创建一个单独的maven模块并将其作为主项目中的依赖项来解决这一问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10544042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档