3

我对注释使用场景有些困惑,我希望您能提供意见。

给定以下注释(在同一个项目中与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,然后编译,因此在 generate-sources 运行时没有可用的 ExistingCustomerMatch 注释类,或者这是否是一个完全不同的野兽。

谢谢, 约安尼斯

4

2 回答 2

2

我通过在 maven 中使用 antrun 插件和 org.jvnet XJC2Task 针对 maven.compile.classpath 使我的 annox JAXB 插件与 xjc 一起工作。(参见http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Task)永远无法让它与直接的 maven 插件一起工作。

但这不是我来这里写作的原因。我猜你来到这里是因为你在谷歌搜索方面非常聪明,并且你坚定地决心通过这个令人讨厌的东西摆脱你所处的任何 JAXB 地狱。我怀着谦卑的心情写信给你,我一次又一次地和你在一起。我今天写信给你说: 停止挣扎,你做错了

我的建议是针对那些在他们的个人“compile-xsd-to-jaxb-beans”冒险中想要通过 annox 或其他任何方式为生成的 JAXB bean 添加注释的人。如果您在那里,那么您可能会因为 XSD 的限制而感到束缚和束缚,或者您的 XSD 可能会失控。

我将我的 XML Schema 构建到 JAXB bean 的经验一开始就非常好,很高兴看到所有这些 pojo 出现,并且我的模式都很好地使用不同的命名空间进行了分解,并导入到一个主 XSD 中。我的构建非常清晰。我发现自己试图在各处添加 Javadoc 文档标签,而我的 XSD 变得越来越复杂。但是我生成的 bean 非常好看,而且我从交易中获得了免费的 Javadocs。我必须添加一些 JAXB 注释(主要是@XMLTransient),而我能让 annox 在 maven 中工作的唯一方法是使用 antrun 插件和 hacky Ant 任务,我对那个 kludge 不满意。我想,为什么这些东西不能正常工作?

然后越来越多的要求迫使我在架构设计上陷入越来越严格的困境,我花费越来越多的时间来破解 XSD - 直到突破点:我必须能够使用 EclipseLink MOXy 编组到 JSON,突然间我的架构可以不要被扭曲成椒盐卷饼,并获得漂亮的 JSON 和 XML。我被卡住了,而且很长时间。

我咨询了一位专家,他告诉我完全放弃我的 schema-to-JAXB-beans 工作。正确的方法是用 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 工作的可怜人。我希望你不会因为你的椒盐卷饼扭曲而受苦。做出改变不会花很长时间,只要去做。

于 2014-09-24T17:58:24.710 回答
0

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

于 2013-09-19T15:33:41.600 回答