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

时间:2012-05-11 00:53:19

标签: java bean-validation jaxb2 jaxb2-basics 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注释似乎工作正常。我想知道的是我是否被循环依赖所困,即生成源首先运行,然后编译,因此当generate-sources运行时,没有ExistingCustomerMatch注释类可用,或者这是否是完全不同的野兽。 / p>

谢谢, 扬

2 个答案:

答案 0 :(得分:2)

我使用maven中的antrun插件和maven.compile.classpath中的org.jvnet XJC2Task使用xjc我的annox JAXB插件。 (参见http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Task)永远无法使用直接maven插件。

但这并不是我来这里写作的原因。我猜你是在这里登陆的,因为你对你的谷歌搜索非常聪明,你坚决决定通过这个annox东西摆脱JAXB的所有问题。我谦卑地写信给你,我一直和你在一起。我今天写信给你说:停止挣扎,你做错了

我的建议是那些在他们的个人&#34; compile-xsd-to-jaxb-beans&#34;冒险,希望通过annox或其他任何东西为生成的JAXB bean添加注释。如果你在那里,那么你可能会受到XSD的限制而受到限制和困扰,或者你的XSD可能会失控。

我将XML Schema构建到JAXB bean中的经验从一开始就非常好,看到所有这些pojos出现并且我的架构都被很好地考虑到了不同的命名空间并导入到一个主XSD中,这是令人欣慰的。我的构建非常清楚。我发现自己试图在任何地方添加Javadoc文档标签,我的XSD变得越来越复杂。但是我生成的豆子看起来非常漂亮,我得到了免费的Javadocs。我不得不加入一些JAXB注释(主要是@XMLTransient),我唯一可以让annox在maven中工作的方法是使用带有hacky Ant任务的antrun插件,我对那个kludge不满意。我想,为什么这些东西不能正常工作?

然后越来越多的要求迫使我使用我的架构设计进入更严格和更严格的角落,我花了越来越多的时间来攻击XSD - 直到突破点:我必须能够使用EclipseLink MOXy编组到JSON,然后突然我的架构无法扭曲到那个椒盐卷饼中,并获得了漂亮的JSON和XML。我被困了很长一段时间。

我咨询了一位专家,他告诉我完全放弃我的架构到JAXB-beans的工作。正确的方法是用JAXB和MOXy注释手工编写我的JAXB bean,然后使用schemagen生成我的.xsd&#39; s。走向另一个方向!?有效。我的schemagen生成的.xsd并不漂亮,但谁在乎,它有效!根据我的bean,模式是正确的,当我解析XML并使用MOXy时,它只能工作,我可以将我的bean编组为JSON。

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

所以,我希望这可以让你找到可怜的灵魂,让XJC工作。我希望你能用椒盐卷饼扭曲来止痛。它不会花费你很长时间来做出改变,就这样做。

答案 1 :(得分:0)

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