使用自定义 doclet 读取 javax 注释
Read javax annotations with custom doclet
我有一堆根本没有评论的 DTO。但是,SQL-数据库中有评论。我可以通过发送查询然后检索结果集来获得这些评论。
我的任务是用 SQL-数据库中的注释创建一个 javadoc-API(如 HTML)以使代码库更好可以理解。
在询问此任务后 ,我尝试着手创建自己的 doclet。然后,我通过重写 Java.Tools 中的 Standard-、Abstract- 和 HtmlDoclet 来编写自己的 doclet。我的结果运行良好,我可以使用数据库中的评论创建 javadoc html 页面。
不过恕我直言,这是一个巨大的黑客攻击。为了获得数据库评论,需要完成两个主要任务。
- 知道table名字
- 知道列名
应该怎么做: (这就是我想问的-我如何实现这样的?)
For 1. : 找到@Table注解。读取名称 = "tablename".
对于 2.:对于每个变量:
是否有@Column 注释? return "columnName" : return ""
我现在是怎么做的:
对于 1. :我读取了 RootDoc.name() 变量,然后逐个读取字符串。找一个大写字母。插入 '_'。最后,将所有内容都转换为 .toUpperCase()。所以 "testFile" 变成 "TEST_FILE".
这有时不起作用。如果您仔细阅读示例 class。它的名称是 "SaklTAdrkla",但数据库table 的名称是 SAKL_T_ADRKLAS。从 RootDoc.name() 解析名称会导致 "SAKL_T_ADRKLA" 最后缺少字符 'S',因此它不会在数据库中找到 table。
对于 2.:我从 ClassDoc 中获取所有字段。然后,我以与解析 RootDoc.name() 变量相同的方式解析 Field.name()。
这与 1 的原因相同。而且还因为某些字段名与其映射名称不同。在示例中 Class - 字段 sakgTAklgrpAklAkgid 在数据库中映射为 AKL_AKGID
我可以通过调用 FieldDoc.annotations() 找到注释本身。但这只是没有字符串的注释(name = "xyz"),这对我来说是最重要的部分!
我找到了 Jax-Doclet,它可以解析 javax 注释。然而,在下载 jar 源文件并实施 java 文件后,存在许多无法解决的依赖性问题,因为引用的 classes 不再存在于 java 8 tools.jar.
是否有另一种解决方案,能够读取 javax 注释?
我可以在我的 doclet 中实现一些东西以便它可以读取 javax 注释吗?
编辑:
我发现您可以在我可以从 FieldDoc.annotations() 获得的 AnnotationDesc class 上调用 .elementValues()。但是,在检索数组的组件类型时,我总是得到 com.sun.jdi.ClassNotLoadedException Type has not been loaded occurred。为了修复它,我通过调用 Class.forName() 手动加载 classes AnnotationDesc 和 AnnotationDesc.ElementValuePair。但是现在带有 elementValuePairs 的数组是空的..?
示例class:
/**
* 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() {
}
我花了很长时间才弄明白这一点,但我终于弄明白了。
问题是我的 doclet 可以找到所有注释,这些注释在控制台中显示为错误。
error: cannot find symbol @Column(name = "TST_USER") private
String tstUser;
我在抛出的大量错误中还发现了这条消息:
error: package javax.persistence does not exist import
javax.persistence.*;
所以我将 javax.persistance.jar 导入到我的项目中。
我还将 com.fasterxml.jaxkson.annotations.jar 添加到项目中,因为没有它它也无法工作。
惊喜惊喜!成功了!
我可以使用 annotation.elementValues() 获取所有注释和注释值。
我不再得到空数组,也不再得到 ClassNotLoadedException。
我有一堆根本没有评论的 DTO。但是,SQL-数据库中有评论。我可以通过发送查询然后检索结果集来获得这些评论。
我的任务是用 SQL-数据库中的注释创建一个 javadoc-API(如 HTML)以使代码库更好可以理解。
在询问此任务后
不过恕我直言,这是一个巨大的黑客攻击。为了获得数据库评论,需要完成两个主要任务。
- 知道table名字
- 知道列名
应该怎么做: (这就是我想问的-我如何实现这样的?)
For 1. : 找到@Table注解。读取名称 = "tablename".
对于 2.:对于每个变量:
是否有@Column 注释? return "columnName" : return ""
我现在是怎么做的:
对于 1. :我读取了 RootDoc.name() 变量,然后逐个读取字符串。找一个大写字母。插入 '_'。最后,将所有内容都转换为 .toUpperCase()。所以 "testFile" 变成 "TEST_FILE".
这有时不起作用。如果您仔细阅读示例 class。它的名称是 "SaklTAdrkla",但数据库table 的名称是 SAKL_T_ADRKLAS。从 RootDoc.name() 解析名称会导致 "SAKL_T_ADRKLA" 最后缺少字符 'S',因此它不会在数据库中找到 table。
对于 2.:我从 ClassDoc 中获取所有字段。然后,我以与解析 RootDoc.name() 变量相同的方式解析 Field.name()。
这与 1 的原因相同。而且还因为某些字段名与其映射名称不同。在示例中 Class - 字段 sakgTAklgrpAklAkgid 在数据库中映射为 AKL_AKGID
我可以通过调用 FieldDoc.annotations() 找到注释本身。但这只是没有字符串的注释(name = "xyz"),这对我来说是最重要的部分!
我找到了 Jax-Doclet,它可以解析 javax 注释。然而,在下载 jar 源文件并实施 java 文件后,存在许多无法解决的依赖性问题,因为引用的 classes 不再存在于 java 8 tools.jar.
是否有另一种解决方案,能够读取 javax 注释?
我可以在我的 doclet 中实现一些东西以便它可以读取 javax 注释吗?
编辑:
我发现您可以在我可以从 FieldDoc.annotations() 获得的 AnnotationDesc class 上调用 .elementValues()。但是,在检索数组的组件类型时,我总是得到 com.sun.jdi.ClassNotLoadedException Type has not been loaded occurred。为了修复它,我通过调用 Class.forName() 手动加载 classes AnnotationDesc 和 AnnotationDesc.ElementValuePair。但是现在带有 elementValuePairs 的数组是空的..?
示例class:
/**
* 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() {
}
我花了很长时间才弄明白这一点,但我终于弄明白了。
问题是我的 doclet 可以找到所有注释,这些注释在控制台中显示为错误。
error: cannot find symbol @Column(name = "TST_USER") private String tstUser;
我在抛出的大量错误中还发现了这条消息:
error: package javax.persistence does not exist import javax.persistence.*;
所以我将 javax.persistance.jar 导入到我的项目中。 我还将 com.fasterxml.jaxkson.annotations.jar 添加到项目中,因为没有它它也无法工作。
惊喜惊喜!成功了!
我可以使用 annotation.elementValues() 获取所有注释和注释值。 我不再得到空数组,也不再得到 ClassNotLoadedException。