【问题标题】:Use JAXB (xjc) generated classes in android在 android 中使用 JAXB (xjc) 生成的类
【发布时间】:2026-01-15 22:35:02
【问题描述】:

我在Android 中使用Rest-WebserviceWeb Service 可以处理JSONXML,API 被描述为XSD。所以我使用JAXBXSD 生成类,然后我使用jackson JSON 处理器从我的实例生成JSON

问题是,JAXB (xjc) 生成带有JAXB 注释的类,而Android 无法处理这些。我尝试将 jaxb-api.jar 添加到我的 android 项目中,但 Dalvik 不会使用核心类。

对于我的第一个实现,我手动删除了注释。但现在XSD 已更新,我不想每次发生这种情况时都这样做。

您知道如何以更好的方式处理此问题吗?是否有可能在没有注释的情况下使用jaxb/xjc,或者是否有其他代码生成器可以做到这一点?您知道从 java 类中删除注释的简单方法(即使它们打印在多行中)? AndroidEclipse 项目是否有项目设置,使 dalvik 允许核心库?

谢谢,cathixx

【问题讨论】:

    标签: android xml json xsd xjc


    【解决方案1】:

    由于我是 Ant 的新手,所以我必须做一些额外的研究才能使 cathixx 的答案起作用,所以我会分享这个以帮助其他人。

    这些指令将采用 Java 文件,其代码如下:

    import javax.xml.bind.annotation.XmlElement;
    
    @XmlRootElement
    public class Response {...
    

    ...并将这些事件注释掉,所以它看起来像:

    /*import javax.xml.bind.annotation.XmlElement;*/
    
    /*@XmlRootElement*/
    public class Response {...
    

    首先,在一个新的 Eclipse 项目中创建一个文件 build.xml(或任何你想调用的文件 - 必须是 .xml)(“通用”项目就可以了)。

    然后,将以下文本添加到build.xml 文件:

    <?xml version="1.0"?>
    <project
        name="CommentOutXmlAnnotations"
        basedir="."
        default="commentOutXmlAnnotations" >
    
    <!-- This Ant script comments out the following lines from the Java files in this directory:
        import javax.xml.bind.annotation.*;
        @Xml*
     -->
        <target
            name="commentOutXmlAnnotations"        
            description="Run" >
                <replaceregexp
                    byline="false"
                    flags="g" >
                    <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)" />
                    <substitution expression="/*\1*/\3" />
                    <fileset dir="." >
                        <include name="*.java" />
                    </fileset>
                </replaceregexp>        
        </target> 
    </project>
    

    将要注释掉 XML 导入和注释的 *.java 文件放在 build.xml 文件所在的目录中。

    在Eclipse中右键build.xml文件,点击“Run As->Ant Build”。

    你应该看到如下输出:

    Buildfile: D:\Eclipse_Projects\StripAnnotations\build.xml
    commentOutXmlAnnotations:
    BUILD SUCCESSFUL
    Total time: 403 milliseconds
    

    ...XML 导入和注释应该从您的文件中注释掉。

    完成!

    注意:如果您想在 build.xml 文件的所有子目录中包含所有 *.java 文件(例如,注释掉为多个包中的一堆 JAXB 类生成的所有 XML 注释/导入),请更改fileset 标记到:

    <fileset dir="." >
        <include name="**/*.java" />
    </fileset>
    

    【讨论】:

    • 首先,很棒的工作!我遇到了一些问题。它不会过滤掉 javax.xml.bind.JAXBElement。 XmlElementRefs 的某些模式被注释掉,即当由于某种原因存在子对象时。一些 XmlEnumValues 没有被注释掉,但其他的被注释掉了。 @XmlElements 也不是。
    • 谢谢!对于 javax.xml.bind.JAXBElement,请尝试从正则表达式中删除“.annotation\”部分 - 我不相信它在包结构中的搜索这么低(javax.xml.bind.*)。对于其他人,不知道为什么有时它会在某些情况下起作用,而有时却不会。
    • @XmlRootElement 好像没有被拾取
    • @XmlElement() 也没有被拾取
    • @spy 看起来您的注释格式有点不同,因此您需要修改正则表达式以匹配。有一段时间没看这个了,但我相信这里显示的只会匹配导入语句和类/方法注释。
    【解决方案2】:

    现在,我通过使用以下ant 脚本注释所有注释自己解决了这个问题:

    <replaceregexp flags="g" byline="false">
      <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)"/>
      <substitution expression="/*\1*/\3"/>
      <fileset dir="path/to/files">
        <include name="*.java"/>
      </fileset>
    </replaceregexp>
    

    【讨论】:

    • 如果它有效,这对我来说将是一个巨大的帮助。但是,我是蚂蚁新手。您能否为刚接触 ant 的人提供更多有关如何使用此脚本的背景信息?比如我在一个目录中有一组.java文件需要转换,我安装了ant。下一步是什么?