Micronaut-Core:如何创建动态端点

2023-12-26

简单的问题。是否可以创建端点而无需@Endpoint? 我想通过文件并根据其上下文的内容创建相当动态的端点。

Thanks!


更新一下我的想法。我想创建类似插件系统的东西,以使我的应用程序对于维护和未来功能更具可扩展性。

值得一提的是,我正在使用 Micronaut 和 Kotlin。现在我已经有了固定定义的端点,它与我的命令脚本相匹配。

我的描述文件将位于/src/main/resources

我有以下example描述文件的样子。

ENDPOINT: GET /myapi/customendpoint/version
COMMAND: """
#!/usr/bin/env bash

# This will be executed via SSH and streamed to stdout for further handling
echo "1.0.0"
"""
# This is a template JSON which will generate a JSON as production on the endpoint
OUTPUT: """
{
  "version": "Server version: $RESULT"
}
"""

我希望如何使其与应用程序一起工作。

import io.micronaut.docs.context.events.SampleEvent
import io.micronaut.context.event.StartupEvent
import io.micronaut.context.event.ShutdownEvent
import io.micronaut.runtime.event.annotation.EventListener

@Singleton
class SampleEventListener {
    /*var invocationCounter = 0

    @EventListener
    internal fun onSampleEvent(event: SampleEvent) {
        invocationCounter++
    }*/

    @EventListener
    internal fun onStartupEvent(event: StartupEvent) {
        // 1. I read all my description files
        // 2. Parse them (for what I created a parser)
        // 3. Now the tricky part, how to add those information to Micronaut Runtime
        
        val do = MyDescription() // After I parsed
        // Would be awesome if it is that simple! :)
        Micronaut.addEndpoint(
          do.getEndpoint(), do.getHttpOption(),
          MyCustomRequestHandler(do.getCommand()) // Maybe there is a base class for inheritance?
        )
    }

    @EventListener
    internal fun onShutdownEvent(event: ShutdownEvent) {
        // shutdown logic here
    }
}

您可以创建一个自定义RouteBuilder这将在运行时注册您的自定义端点:

@Singleton
class CustomRouteBuilder extends DefaultRouteBuilder {

    @PostConstruct
    fun initRoutes() {
        val do = MyDescription();
        val method = do.getMethod();
        val routeUri = do.getEndpoint();
        val routeHandle = MethodExecutionHandle<Object, Object>() {
            // implement the 'MethodExecutionHandle' in a suitable manner to invoke the 'do.getCommand()'
        };
        buildRoute(HttpMethod.parse(method), routeUri, routeHandle);
    }
}

请注意,虽然这仍然可行,但最好考虑另一个扩展路径,因为该解决方案会破坏整个解决方案米克罗特作为 AOT 编译框架的哲学。

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

Micronaut-Core:如何创建动态端点 的相关文章

随机推荐

  • 48 位/6 字节长的时间戳格式是什么?

    我有一个文件的时间戳格式我不明白 我无权访问创建该文件的代码 并且它不是标准格式 因此我在十六进制编辑器中逐段进行查看 并且我发现了我无法找到的格式的时间戳查找有关的信息 这是一个 48 位数字 其中 12 位表示年份 从 0 开始 4 位
  • 参数和NULL

    我在使用 RPostgres 和 RPostgreSQL 将 NULL 作为 INSERT 参数查询传递时遇到问题 在 PostgreSQL 中 create table foo ival int tval text bval bytea
  • Angular:strictTemplates - 如何正确分配变量

    我在我的Sample html某处定义的
  • mysql innodb 事务并发

    我有3张桌子 Products 产品编号最大可销售产品数可以销售给个人的最大产品数 购买 user id产品编号数量 预订 产品编号 user id数量 希望你能理解这个结构 现在 当用户尝试购买产品时 我必须检查 max products
  • 防止 QDockWidget 自动调整大小行为

    Qt 5 5 0 在我的应用程序中 我有一个 QGraphicsView 作为主要小部件和一个 QDockWidget 作为属性 目标是让用户在图形视图中选择一个项目 并根据该项目显示该项目的适当属性 我通过使用属性管理器小部件来实现此目的
  • Gunicorn 工人创建僵尸进程

    这不是一个真正的问题 但我确实想了解发生了什么 以及为什么会创建这些僵尸进程 还想看看是否有针对这种事情的好的做法 现在我做kill HUP在主 Gunicorn 进程上 它会摆脱僵尸进程 我会自动kill HUP每天早上进行日志轮换 我想
  • Excel 求解器忽略 VBA 中的约束

    我正在尝试使用求解器找到简单投资组合的最大回报 在工作表中直接使用 Solver 可以正常工作 但在 VBA 中设置命令时则不然 相反 正如您从屏幕截图中看到的 它忽略了其中一个约束 T10 中计算的权重总和应 1 有趣的是 如果我将第三行
  • cx_Freeze 帮助:有没有办法不打开控制台?

    我正在尝试将 python 游戏 用 pygame 制作 转换为 Windows 的 exe 文件 我使用 cx Freeze 进行了操作 那里没有问题 问题是 当我启动 myGame exe 时 它 会打开正常的 Pygame 窗口和控制
  • 如何清空 BlockingCollection

    我有一个线程将项目添加到BlockingCollection 在我正在使用的另一个线程上foreach var item in myCollection GetConsumingEnumerable 如果出现问题 我想打破我的 foreac
  • Vimscript:列出的缓冲区数量

    在我的 vim 脚本中 我需要获取所有被视为列出 可列出的缓冲区的计数 即所有执行此操作的缓冲区 not具有未列出的 u 属性 推导该值的推荐方法是什么 你可以使用bufnr 获取最后一个缓冲区的编号 然后创建一个 列出从 1 到该数字并过
  • 使用指针嵌套 std::map

    我在地图内使用地图 并希望访问第二个地图中的特定成员 std map
  • 在Web Api中使用Postman授权属性认证

    我正在使用 RESTful 服务 并发现 Postman 是 GET POST 和测试 API 的最佳插件之一 我在邮递员中找到基本身份验证 无身份验证 DIgest Auth OAuth AWS 如何测试授权控制器和方法 我知道授权属性检
  • 为什么这个SQL语句很慢?

    我有一个包含大约 100 万条记录的表 运行 SQL Server 2008 Web 我有一个搜索例程 尝试匹配产品代码和产品描述 但在某些情况下 速度非常慢 下面是 精简的 sql 语句 WITH AllProducts AS SELEC
  • 当进行相同的 PDO 查询(参数不断变化)时,我是每次都调用prepare(),还是只调用一次?

    我正在尝试学习如何使用 PDO 并且需要帮助理解一些内容 我一直读到使用 PDO 的最大好处之一是它比mysql 当一遍又一遍地进行类似的查询时 我需要进行一个完全相同的查询 只是绑定参数每次都会改变 但查询的结构是相同的 所以 这是我的问
  • 如何覆盖 Riverpod StateNotifier 的状态以进行测试

    我想覆盖我的StateNotifierProvider手动声明以进行测试 可以使用以下方式覆盖提供者ProviderContainer or ProviderScope 但它只提供了覆盖通知者的选项 而不是状态 我的问题是我应该如何覆盖状态
  • Jquery图像叠加?

    我希望使用 jquery 将右上角的图像覆盖在另一张图像上 基本上 当用户的鼠标悬停在图像上方时 我希望第二个图像出现在右上角的另一张图像上方 然后当用户停止悬停在图像上时消失 我如何用 Jquery 实现这一点 Senad 是很正确的 你
  • 父进程如何通过调用_exit的子进程的wait来获取终止状态

    我已阅读以下声明 给 exit 的 status 参数定义了终止状态 该进程 当该进程的父进程可用时 该进程可用 调用 wait 进程总是由 exit 成功终止 即 出口 一去不复返 Question If exit不返回 父进程如何获取终
  • ASP.Net MVC jQuery AJAX 路由问题

    我的页面是domain com home details 1 在我的 jQuery AJAX 调用中 我有以下内容 但是当它进行该调用时 它会调用domain com home details home getdata 我该怎么做才能让它得
  • React Native:无法导入 csv 文件

    我有一个csv文件位于 src data文件夹 我希望导入它以便能够传递到帕帕帕斯库被解析为JSON图书馆 这是我用来执行此操作的脚本 import Papa from papaparse import file from src data
  • Micronaut-Core:如何创建动态端点

    简单的问题 是否可以创建端点而无需 Endpoint 我想通过文件并根据其上下文的内容创建相当动态的端点 Thanks 更新一下我的想法 我想创建类似插件系统的东西 以使我的应用程序对于维护和未来功能更具可扩展性 值得一提的是 我正在使用