9

这可能是这个问题的重复(避免 xjc 生成的代码上的编译器警告),但由于我不太精通 XJC/JAXB 自定义绑定特性,我想我可能误解了上述问题。

我的问题似乎很简单——如何@SuppressWarnings("all")向生成的 JAXB 类添加注释?我们的项目有 0 个警告策略,在 JAXB 生成步骤之后,我们最终得到了 350 多个警告,这只是可怕的噪音。

我希望 XJC 上有一个简单的标志,或者至少是一种提供此类信息的简单方法,但我找不到任何信息。

根据我在旅行中看到的情况,人们会做以下事情之一:

  1. @lexicore 的JAXB2 Annotate Plugin,根据示例,它似乎可以完成这项工作,但添加一个完整的框架和数百 kB 的代码只是为了向一堆类添加简单的注释?真的??,
  2. 自定义 JAXB 绑定(我可能弄错了,但这看起来很神秘,我不确定是否可以这样做),
  3. 将执行搜索和替换后 JAXB 生成的自定义 ANT 目标,
  4. Eclipse 4+ 似乎有一个选项可以过滤掉选定项目的警告,但由于各种历史/遗留原因,我们被困在 Eclipse 3.7.2 (Indigo) 上,
  5. 将执行注释插入的自定义 XJC 插件(如其中一位评论者所建议,请参见此处),
  6. 将所有生成的类放在一个 JAR 中,使 JAR 成为项目的依赖项,然后完全删除生成的代码。

以前,我们通过将与 XML 相关的代码放在一个单独的 Eclipse 项目中,然后禁用项目上的警告/错误来处理这个问题。现在,作为代码整合/重构的一部分,我们已经重新洗牌,不再拥有这种奢侈。

对于这样一个看似微不足道的问题,真的没有优雅的解决方案吗?非常感谢任何反馈/想法。

FWIW,我们的项目使用 Ant 作为构建系统。

4

2 回答 2

7

你必须使用这个插件:jaxb2-annotate-plugin

2个解决方案:

1 - 修改你的 xsd 并添加这种块

<xsd:element name="foobar" type="xsd:string">
    <xsd:annotation>
        <xsd:appinfo>
            <annox:annotate>@java.lang.SuppressWarnings("all")</annox:annotate>
        </xsd:appinfo>
    </xsd:annotation>
</xsd:element>

2 - 创建自定义绑定

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:annox="http://annox.dev.java.net"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    jaxb:extensionBindingPrefixes="xjc annox"
    version="2.1">
    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <annox:annotate target="class">@java.lang.SuppressWarnings("all")</annox:annotate>
    </jaxb:bindings>
</jaxb:bindings>
于 2014-11-07T10:29:31.840 回答
5

免责声明:我是@ToYonos 答案中提到的jaxb2-annotate-plugin的作者。

这不是一个独立的答案,而是@ToYonos 答案的补充。

我想从问题中解决以下几点。

  1. 来自 Atlassian 的 JAXB2 Basics 框架/项目的 Annox 插件(根据示例,似乎可以完成这项工作,但添加了一个完整的框架和数百 kB 的代码只是为了向一堆类添加简单的注释?真的吗??),

我只需要添加一些注释:

  • 首先,这不是“Atlassian 的”框架/项目。我既不是员工,也不是 Atlassian 或 Sun 或 Oracle 的附属机构(尽管我是 Sun/Oracle 的官方贡献者)。这是一个独立的开源项目,不受任何公司推动。
  • 接下来,jaxb2-annotate-plugin被移动到一个独立项目,它不再是JAXB2 Basics的一部分。它太大了,应该成为一个独立的东西。
  • 关于“一个完整的框架和数百 kB 的代码”。
    • jaxb2-annotate-plugin不需要或向您的代码添加任何运行时依赖项。如果您的注解具有运行时保留,您将需要运行时注解的类,但这应该是显而易见的。
    • jaxb2-annotate-plugin确实有许多编译时依赖项,例如用于从 Java 语法解析注释的嗯,这是因为插件必须做很多中等高级的事情,比如从 Java 语法解析注释并将它们转换为以添加到生成的代码中。我个人认为编译时几百 kB 根本不是问题。

因此,从我的角度来看,@ToYonos 目前提供了一个合理的解决方法


现在,正确的修复会是什么样子?

  • 正确的解决方法是修复 XJC。其他一切都只是一种解决方法。
  • 此问题存在JAXB-1053问题。Iaroslav 正确地指出,只要1.6必须支持,就不能应用钻石修复。
  • CodeModel也必须更新以支持 Java 7+ 结构。
  • 您可以通过在 GitHub 上为 XJC 代码分叉和提供 PR 来提供帮助。但是我不能说 PRs 真的被应用了。我的三个 PR正在筹备中,已经有一个月左右的时间了。
  • 可以编写一个 XJC 插件来覆盖代码生成。这并不容易,但可能。

正确的修复看起来并不容易,我会选择一种解决方法并等待供应商修复。

于 2014-11-07T12:28:37.440 回答