使用自定义doclet

时间:2018-01-15 13:24:09

标签: java javadoc javax doclet

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

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

在询问了这个任务HERE后,我试着创建自己的doclet。然后我通过重写Java.Tools中的Standard-,Abstract-和HtmlDoclet来编写自己的doclet。我的结果工作正常,我可以使用数据库中的注释创建javadoc html页面。

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

  1. 知道表名
  2. 知道列名称
  3. 应该如何完成: (这就是我想问的问题 - 如何实现它?)

    对于1.:找到@Table注释。读取名称=" tablename"。

    对于2.:对于每个变量:

    是否有@Column注释? return" columnName" :return""

    我现在该怎么做:

    对于1.:我读取RootDoc.name()变量,然后通过char读取String char。找一个大写字母。插入' _'。最后,转动所有.toUpperCase()。所以" testFile"变成" TEST_FILE"。

    这有时不起作用。如果您在示例类中仔细阅读。它的名字是" SaklTAdrkla"但Databasetable名称是SAKL_T_ADRKLAS。从RootDoc.name()解析名称将导致" SAKL_T_ADRKLA"缺少角色' S'最后,因此它不会在数据库中找到该表。

    对于2.:我从ClassDoc中获取所有Fields。然后我解析Field.name()与解析RootDoc.name()变量的方式相同。

    这与1的原因相同。但也因为某些字段名称与其映射名称不同。在示例类 - 字段中,sakgTAklgrpAklAkgid在数据库中映射为AKL_AKGID

    我可以通过调用FieldDoc.annotations()找到Annotation itselfe。但那只是没有String的注释(name =" xyz"),这对我来说是最重要的部分!

    我找到了Jax-Doclet,它可以解析javax注释。但是,在下载jar-source文件并实现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() {
       }
    

1 个答案:

答案 0 :(得分:1)

现在我花了很长时间来解决这个问题,但我最终做到了。

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

  

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

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

  

错误:包javax.persistence不存在导入   javax.persistence。*;

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

惊喜惊喜!它工作!

我可以使用annotation.elementValues()获取所有注释和注释值。  我不再获得一个空数组,也不会得到ClassNotLoadedException。