10

我有这个测试课

import javax.xml.bind.annotation.XmlElement;

class CompileTest {

   void foo( @XmlElement String in ) {
   }

}

我的java版本是

$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)

当我尝试编译该类时,我得到了

javac CompileTest.java
CompileTest.java:5: annotation type not applicable to this kind of declaration
   void foo( @XmlElement String in ) {
             ^
1 error

这对 Java 6 有效。当我尝试将较新的 JAXB 库添加到类路径时,它没有帮助。有没有办法解决这个问题?

javac -cp jaxb-api-2.2.4.jar CompileTest.java
4

3 回答 3

11

使用Java 认可的标准覆盖机制

把你的jaxb-api-2.2.4.jar内部<java-home>\lib\endorsed目录。

或者,使用 -D java.endorsed.dirs选项

javac -Djava.endorsed.dirs=/your/path/to/jaxb-directory CompileTest.java

参考资料:
http ://docs.oracle.com/javase/6/docs/technotes/guides/standards/

于 2013-04-25T13:20:20.000 回答
4

使用“认可库”文件夹的概念。看看这里: 如何让 Ant 使用 JAXB x 而不是 Java 6 SE JAXB 类...

基本上,这是一种指示 JRE 使用更新版本的 JAXB 的方法。

您可以在此处阅读更多内容: JAXB 非官方指南:将 JAXB 2 与 SE 6 一起使用 另请参阅此问题: 在 JRE 6 中使用认可目录的确切方法是什么

于 2013-04-25T13:14:50.733 回答
2

它只能应用于字段或方法,不能应用于方法参数。看

@Retention(RUNTIME) @Target({FIELD, METHOD})
public @interface XmlElement {

编辑:XmlElement 的来源(JDK 1.6.0_18)

 * @since JAXB2.0
 * @version $Revision: 1.19 $
 */

@Retention(RUNTIME) @Target({FIELD, METHOD})
public @interface XmlElement {

所以我看到的是 1.6.0_18 版本具有 1.19 版本的 XmlElement,只有FIELDMETHOD目标可用。

编辑:所以你的问题是 jdk 1.6 XmlElement 与 jaxb.2.2 不同。您可以在http://grepcode.com/file/repo1.maven.org/maven2/javax.xml.bind/jaxb-api/2.2.4/javax/xml/bind/annotation/XmlElement.java?av查看源代码=f

于 2013-04-25T13:02:26.057 回答