0

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

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

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

然而,它是一个巨大的黑客恕我直言。为了获得数据库注释,需要完成两项主要任务。

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

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

对于 1. :找到 @Table 注释。读取名称 = “表名”。

对于 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() 找到注释本身。但这只是没有字符串(名称=“xyz”)的注释,这对我来说是最重要的部分!

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

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

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


编辑:

我发现你可以在我可以从 FieldDoc.annotations() 获得的 AnnotationDesc 类上调用 .elementValues()。但是,在检索数组的组件类型时,我总是得到一个 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() {
   }
4

1 回答 1

1

我现在花了很长时间才弄清楚这一点,但我终于做到了。

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

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

我还发现了很多错误中的这条消息:

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

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

惊喜惊喜!有用!

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

于 2018-01-17T08:30:44.197 回答