我得到了一堆根本没有评论的 DTO。但是,SQL 数据库中有注释。我可以通过发送查询然后检索 ResultSet 来获得这些评论。
我的任务是使用 SQL 数据库中的注释创建一个 javadoc-API(作为 HTML),以使代码库更易于理解。
在询问了这个任务之后,我试图研究创建我自己的 doclet。然后,我通过从 Java.Tools 重写 Standard-、Abstract- 和 HtmlDoclet 来编写自己的 doclet。我的结果运行良好,我可以使用数据库中的评论创建 javadoc html 页面。
然而,它是一个巨大的黑客恕我直言。为了获得数据库注释,需要完成两项主要任务。
- 知道表名
- 知道列名
应该怎么做:( 这就是我想问的——我该如何实现它?)
对于 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() {
}