自动将 Spring @RequestMapping 注释记录到一个位置?

2024-03-09

Javadoc 非常适合扫描所有源文件并创建 HTML 页面来查看它。我想知道是否有一个类似的工具可以遍历所有 Spring 控制器并收集所有用 @RequestMapping 注释的方法并生成一个列出它们的 HTML 页面。有点像开发人员的伪站点地图,以确保控制器之间的唯一性和标准化。

如果这个问题已经在其他地方被问过,我深表歉意。我无法想出一组合适的搜索词来提供有用的结果。


这是一个非常好的问题,我经常错过(并实现)这样的功能。

使用构建工具

我要做的是运行 Maven (或 ant)并在编译后执行一个任务

  • 读取所有类(可能带有可配置的包列表)
  • 迭代这些类的所有方法
  • 读取注释
  • 并将输出写入 HTML

使用注释处理

但我想这是一个场景,其中注释处理 http://download.oracle.com/javase/6/docs/technotes/guides/apt/index.html也可能是一种方法。通常,您必须使用一些内部 API 来完成 API 中的工作,但是使用Filer.createResource(...) http://download.oracle.com/javase/6/docs/api/javax/annotation/processing/Filer.html#createResource%28javax.tools.JavaFileManager.Location%2C%20java.lang.CharSequence%2C%20java.lang.CharSequence%2C%20javax.lang.model.element.Element...%29实际上应该可以开箱即用。

这是一个基本的实现:

public class RequestMappingProcessor extends AbstractProcessor{

    private final Map<String, String> map =
        new TreeMap<String, String>();

    private Filer filer;

    @Override
    public Set<String> getSupportedAnnotationTypes(){
        return Collections.singleton(RequestMapping.class.getName());
    }

    @Override
    public synchronized void init(
        final ProcessingEnvironment processingEnv){
        super.init(processingEnv);
        filer = processingEnv.getFiler();
    }

    @Override
    public boolean process(
        final Set<? extends TypeElement> annotations,
        final RoundEnvironment roundEnv){

        for(final TypeElement annotatedElement : annotations){
            final RequestMapping mapping =
                annotatedElement.getAnnotation(
                    RequestMapping.class
                );
            if(mapping != null){
                addMapping(mapping, annotatedElement, roundEnv);
            }
        }
        assembleSiteMap();
        return false;
    }

    private void assembleSiteMap(){
        Writer writer = null;
        boolean threw = false;
        try{
            final FileObject fileObject =
                filer.createResource(
                    StandardLocation.CLASS_OUTPUT,
                    "html", "siteMap.html"
                );
            writer = fileObject.openWriter();
            writer.append("<body>\n");
            for(final Entry<String, String> entry : map.entrySet()){
                writer
                    .append("<a href=\"")
                    .append(entry.getKey())
                    .append("\">")
                    .append("Path: ")
                    .append(entry.getKey())
                    .append(", method: ")
                    .append(entry.getValue())
                    .append("</a>\n");
            }
            writer.append("</body>\n");

        } catch(final IOException e){
            threw = true;
            throw new IllegalStateException(e);
        } finally{

            // with commons/io: IOUtils.closeQuietly(writer)
            // with Guava: Closeables.close(writer, rethrow)
            // with plain Java this monstrosity:
            try{
                if(writer != null){
                    writer.close();
                }
            } catch(final IOException e){
                if(!threw){
                    throw new IllegalStateException(e);
                }
            } finally{
            }
        }
    }

    private void addMapping(final RequestMapping mapping,
        final TypeElement annotatedElement,
        final RoundEnvironment roundEnv){
        final String[] values = mapping.value();
        for(final String value : values){
            map.put(
                value,
                annotatedElement.getQualifiedName().toString()
            );
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动将 Spring @RequestMapping 注释记录到一个位置? 的相关文章

  • 如何检查字符串是否具有特定模式[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户输入任意字符串 程序会区分该字符
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • 可以向 @ManyToMany Hibernate 额外表添加额外字段吗?

    我有这两类 表 Entity Table name course public class Course Id Column name courseid private String courseId Column name coursen
  • 如何使用基于 Spring MVC 注解的 Portlet 控制器通过 AJAX 呈现 JSON 视图/响应?

    在过去的六个小时里 我在 Google 和 stackoverflow 上搜索了这个问题的答案 我最初是一名 PHP 开发人员 所以请耐心等待 从 PHP 控制器返回 JSON 数组非常简单 我正在使用 Spring MVC 3 0 我只想
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 从 org.w3c.dom.Node 获取 Xpath

    我可以从 org w3c dom Node 获取完整的 xpath 吗 假设当前节点指向 xml 文档中间的某个位置 我想提取该元素的 xpath 我正在寻找的输出 xpath 是 parent child1 chiild2 child3
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • 如何将 currentTimeMillis 转换为可读的日期格式? [复制]

    这个问题在这里已经有答案了 我想用currentTimeMillis两次 这样我就可以计算持续时间 但我也想以用户可读的格式显示时间和日期 我遇到了麻烦currentTimeMillis有利于计算 但我看不到内置函数可以转换为合适的时间或时
  • Spring @Value 添加验证小于

    我使用以下属性值注入 我如何向此操作添加小于验证 我的意思是我想设置一个验证user maxpassiveday可以说 财产价值不得低于 100 Value user maxpassiveday int maxpassiveday 使用Sp
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 日志记录在 Android 设备上实际上有什么作用?

    我一直在 Android 示例中看到这样的代码 try catch Exception e Log e Error e getMessage 什么是Log e实际上在物理设备上做什么 它进入系统日志 开发人员可以通过 SDK 工具访问该日志
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • 按字母顺序对对象的 ArrayList 进行排序

    我必须创建一个方法来排序数组列表根据电子邮件按字母顺序排列对象 然后打印排序后的数组 我在排序时遇到麻烦的部分 我已经研究过并尝试使用Collections sort vehiclearray 但这对我不起作用 我是因为我需要一个叫做比较器
  • 在Java的System.out中以表格格式输出

    我正在从数据库获取结果 并希望将数据作为 Java 标准输出中的表输出 我尝试过使用 t 但我想要的第一列的长度变化很大 有没有办法将其显示在类似输出的漂亮表格中 Use System out format http java sun co

随机推荐

  • 无法在 Golang 中的 GET 请求标头中传递 Bearer 令牌

    我正在使用 oauth2 访问第三方 API 我可以正常获取访问令牌 但是当我尝试通过在请求标头中传递不记名令牌来调用 API 时 会出现 401 未经授权 错误 尽管当我尝试通过 POSTMAN 通过将标头传递为 Authorizatio
  • 屏蔽张量的损失

    假设我有像这样的 logits 4 3 0 5 2 7 0 0 0 5 2 3 0 0 0 显然 第一个示例中的最后两个和第二个示例中的最后三个被屏蔽 即它们为零 并且不应影响损失和梯度计算 如何计算此 logits 和相应标签之间的交叉熵
  • 如何检查打字稿中的数组列表中是否有重复项?

    您好 目前我的打字稿代码中有一个这样的数组 我如何检查数组中是否有一个项目出现两次 我希望创建函数 如果传递的数组包含重复元素 它将返回 true 或 false let tagonTypes Array
  • 为什么不使用base128? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 从 Exif 数据计算照度

    我如何通过iPhone相机计算勒克斯或照度 我已经计算了所有exif数据 如下所示 key FocalLength value 3 85 key MeteringMode value 5 key ShutterSpeedValue valu
  • 具有固定页眉的真正粘性页脚?

    首先 请阅读整个问题 以便您能够充分理解我在寻找什么 谢谢 这是我长期以来一直在尝试研究的一个问题 并且困扰了我一段时间 我可以有一个真正的粘性页脚和固定页眉吗 如何实现带有固定页眉的粘性页脚 我无法向正文或内容添加填充或边距 因为这会破坏
  • Node.js Busboy 分别解析字段和文件

    我想知道是否可以让 Busboy 分别解析字段和文件 我已经删除了bodyParser因为您可以很容易地用临时文件填充硬盘 例如 解析器发布字段的中间件 用于所有 POST 请求 if req method POST var form ne
  • Javascript - 如何替换子字符串?

    这是一个简单的问题 我想使用 Javascript 在客户端将一个子字符串替换为另一个子字符串 原始字符串是 original READ ONLY 我想更换 READ ONLY with READ WRITE 请问有什么快速答复吗 可能有一
  • C# / F# 性能比较

    网络上是否有任何 C F 性能比较来显示新 F 语言的正确用法 自然 F 代码 例如函数式 不可变 比自然 命令式 可变面向对象 C 代码慢 然而 这种 F 比通常的 C 代码要短得多 显然 这是一个权衡 另一方面 在大多数情况下 您可以实
  • VHDL 中数组的硬件表示

    使用 VHDL 我想要一些寄存器 每个寄存器存储 16 位 所以我发现VHDL有一个内置数组 我想用它来存储iy中每个元素的16位 所以我想知道VHDL是否将此数组映射到实际寄存器 简短的回答是否定的 数组类型不映射到寄存器 长答案 VHD
  • 升级到 OSX Mojave 后 GCP 将无法工作

    升级到 OSX Mojave Developer beta 2 后 每次使用 GCP 以及重新安装时都会出现错误 ERROR gcloud failed to load No module named zlib gcloud main im
  • php中超过24小时的字符串

    有一个语法错误 您的变量名称是 hour 但最后您使用了 hours time1 strtotime 02 40 00 time2 strtotime 34 20 00 diff time2 time1 hour floor diff 60
  • QT:将我的域对象基于 QObject 是一个好主意吗?

    我对于将 QT 框架与 C 结合使用相当陌生 我想知道 将我的域类基于 QObject 是一个好主意吗 或者我应该只对层次结构中较高的类执行此操作 更接近用户界面级别 QT文档对此并不清楚 摘自QT文档 元对象系统是 C 的扩展 使该语言更
  • 在 iOS 中 - 如何使 UILabel 适合其文本而不改变其位置?

    我正在打电话sizeToFit on a UILabel其中有右对齐的文本 它缩小了高度和宽度UILabel并将文本调整到左上角UILabel 现在 的位置UILabel是不正确的 我怎样才能使UILabel留在原来的位置 右对齐 还是移动
  • 如何使用 mod_rewrite/htaccess 通过锚点检测并重定向 URL?

    我见过很多相反的例子 但我希望从锚点 哈希 URL 转到非锚点 URL 如下所示 From http old swfaddress site com page name To http new html site com page name
  • 删除laravel中的特定迁移

    根据 laravel 文档 要回滚最新的迁移操作 您可以使用 rollback 命令 此命令回滚最后 批次 的迁移 其中可能包括多个迁移文件 php artisan migrate rollback 您可以通过向回滚命令提供步骤选项来回滚有
  • 无法使用 Java 1.8 在 JBoss 5.1 中编译 JSP 文件

    无法使用 Java 1 8 在 JBoss 5 1 中编译 JSP 文件 能够编译常规Java文件 甚至能够完成没有JSP的Spring项目 如果我们保留这些 JSP 文件的编译类文件 它就可以正常工作 以下是我尝试运行 JSP 文件时遇到
  • 如何使用 React.js 循环 JSX 中的对象

    所以我有一个 React js 组件 我想循环遍历我导入的对象以向其添加 HTML 选项 这是我尝试过的 既丑陋又不起作用 import React from react import AccountTypes from data Acco
  • 使用 Django RequestFactory 而不是表单数据的 POST 文档

    我想构建一个测试中间件的请求 但我不希望 POST 请求始终假设我正在发送表单数据 有没有办法设置request body根据生成的请求django test RequestFactory 即 我想做类似的事情 from django te
  • 自动将 Spring @RequestMapping 注释记录到一个位置?

    Javadoc 非常适合扫描所有源文件并创建 HTML 页面来查看它 我想知道是否有一个类似的工具可以遍历所有 Spring 控制器并收集所有用 RequestMapping 注释的方法并生成一个列出它们的 HTML 页面 有点像开发人员的