【发布时间】: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. :找到 @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() {
}
【问题讨论】: