gpt4 book ai didi

java - 使用自定义 doclet 读取 javax 注释

转载 作者:行者123 更新时间:2023-12-02 11:45:11 25 4
gpt4 key购买 nike

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

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

在询问了这个任务之后 HERE ,我尝试创建自己的 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() 找到注释本身。但这只是没有字符串(name =“xyz”)的注释,这对我来说是最重要的部分!

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

还有其他解决方案能够读取 javax 注释吗?

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

<小时/>

编辑:

我发现您可以在 AnnotationDesc 类上调用 .elementValues(),我可以从 FieldDoc.annotations() 获取该类。但是,在检索数组的组件类型时,我总是收到 com.sun.jdi.ClassNotLoadedException Type has not be returned 的消息。为了解决这个问题,我通过调用 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() {
}

最佳答案

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

问题是我的 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。

关于java - 使用自定义 doclet 读取 javax 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com