gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:33:50 26 4
gpt4 key购买 nike

我对注释的使用场景有点困惑,我希望得到您的意见。

给定以下注释(与 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 注释类,或者这是否是一个完全不同的野兽。

谢谢,约阿尼斯

最佳答案

我通过在 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 的困境。我怀着谦卑的心情写信给你,我一次又一次地和你在一起。我今天写信给你是想说:停止挣扎,你做错了

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

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

然后,越来越多的要求迫使我在模式设计上陷入越来越狭窄的角落,我花费越来越多的时间来破解 XSD - 直到突破点:我必须能够使用 EclipseLink MOXy 编码为 JSON,突然之间我的模式不能扭曲成那个椒盐脆饼并获得好看的 JSON 和 XML。我被困住了,而且很长一段时间。

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

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

所以,我希望这能影响到你们这些试图让 XJC 工作的可怜人。我希望你不再因扭扭椒盐卷饼而受苦。进行更改不会花很长时间,直接去做。

关于java - 带有 jaxb/annox 和自定义注释的 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com