【问题标题】:Read javax annotations with custom doclet使用自定义 doclet 读取 javax 注释
【发布时间】:2018-06-24 03:17:47
【问题描述】:

我得到了一堆根本没有评论的 DTO。但是,SQL 数据库中有 cmets。我可以通过发送查询然后检索 ResultSet 来获取这些 cmets。

我的任务是使用 SQL 数据库中的 cmets 创建一个 javadoc-API(作为 HTML),以使代码库更易于理解。

在询问过这个任务HERE 之后,我试图研究创建自己的 doclet。然后,我通过从 Java.Tools 重写 Standard-、Abstract- 和 HtmlDoclet 来编写自己的 doclet。我的结果运行良好,我可以使用数据库中的 cmets 创建 javadoc html 页面。

但是,恕我直言,这是一个巨大的黑客攻击。为了获取数据库 cmets,需要完成两项主要任务。

  1. 知道表名
  2. 知道列名

应该怎么做: (这就是我想问的——我该如何实现呢?)

对于 1. :找到 @Table 注释。读取名称 = "tablename"。

对于 2. :对于每个变量:

有@Column 注释吗?返回“列名”:返回“”

我现在是怎么做的:

对于 1. :我读取 RootDoc.name() 变量,然后逐个字符读取字符串。找一个大写字母。插入 '_'。最后,将所有内容都转为 .toUpperCase()。所以“testFile”变成了“TEST_FILE”。

这有时不起作用。如果您在示例类中仔细阅读。它的名称是“SaklTAdrkla”,但数据库表名称是 SAKL_T_ADRKLAS。从 RootDoc.name() 解析名称会导致“SAKL_T_ADRKLA”最后缺少字符“S”,因此在数据库中找不到表。

对于 2. :我从 ClassDoc 中获取所有字段。然后我用解析 RootDoc.name() 变量的方式解析 Field.name()。

由于与 1 相同的原因,这不会起作用。但也因为某些字段名与其映射名称不同。在示例类中 - 字段 sakgTAklgrpAklAkgid 在数据库中映射为 AKL_AKGID


我可以通过调用 FieldDoc.annotations() 找到注释本身。但这只是没有 String (name = "xyz") 的注释,这对我来说是最重要的部分!

我找到了可以解析 javax 注释的 Jax-Doclet。然而,在下载 jar 源文件并实现 java 文件后,由于 java 8 tools.jar 中不再存在引用的类,存在许多无法解决的依赖问题。

是否有另一种能够读取 javax 注释的解决方案?

我可以在我的 doclet 中实现一些东西,以便它可以读取 javax 注释吗?


编辑:

我发现您可以在 AnnotationDesc 类上调用 .elementValues(),我可以从 FieldDoc.annotations() 获得该类。但是,在检索数组的组件类型时,我总是得到一个 com.sun.jdi.ClassNotLoadedException 类型未加载。为了修复它,我通过调用 Class.forName() 手动加载类 AnnotationDesc 和 AnnotationDesc.ElementValuePair。但是现在带有 elementValuePairs 的数组是空的..?

示例类:

    /**
 * The persistent class for the SAKL_T_ADRKLAS database table.
 */
@Entity
@IdClass(SaklTAdrklaPK.class)
@Table(name = "SAKL_T_ADRKLAS")
@NamedQuery(name = "SaklTAdrkla.findAll", query = "SELECT s FROM SaklTAdrkla s")
public class SaklTAdrkla implements Serializable, IModelEntity {
   private static final long serialVersionUID = 1L;

   @Id @Column(name = "AKL_AKLID") private String aklAklid;

   @Id
   // uni-directional many-to-one association to SakgTAklgrp
   @JsonBackReference(value = "sakgTAklgrpAklAkgid") @ManyToOne @JoinColumn(name = "AKL_AKGID") private SakgTAklgrp sakgTAklgrpAklAkgid;

   @Temporal(TemporalType.TIMESTAMP) @Column(name = "AKL_AEND") private Date aklAend;

   @Column(name = "AKL_DEFLT") private BigDecimal aklDeflt;

   @Column(name = "AKL_SPERRE") private BigDecimal aklSperre;

   @Column(name = "AKL_T_BEZ") private String aklTBez;

   @Column(name = "AKL_USRID") private String aklUsrid;

   public SaklTAdrkla() {
   }

【问题讨论】:

    标签: java javadoc javax doclet


    【解决方案1】:

    我现在花了很长时间才弄明白,但我终于弄明白了。

    问题是我的 doclet 可以找到所有注释,这些注释在控制台中显示为错误。

    错误:找不到符号 @Column(name = "TST_USER") private 字符串 tstUser;

    我还在抛出的大量错误中发现了这条消息:

    错误:包 javax.persistence 不存在导入 javax.persistence.*;

    所以我将 javax.persistance.jar 导入到我的项目中。 我还在项目中添加了 com.fasterxml.jaxkson.annotations.jar,因为没有它它也无法工作。

    惊喜惊喜!它有效!

    我可以通过使用 annotation.elementValues() 来获取所有的注解和注解值。 我不再得到一个空数组,也没有得到 ClassNotLoadedException。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 2011-10-08
      • 2018-06-20
      • 2015-09-15
      • 2017-04-02
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多