如何配置 micronaut 序列化以使用开放的 api 生成的模型?
How do I configure micronaut serialization to work with open api generated models?
问题描述
我有一个项目,我正在使用 micronaut 构建 RESTful api。响应正文中 returned 的模型是从开放的 api 规范(使用 gradle 插件)生成的。
但是,出于某种原因,micronaut 总是 return 将任何模型对象作为空 json 对象 {},即使它应该是填充对象。
存储库Link
https://gitlab.com/connorbutch/open-api-micronaut-quarkus
输出示例
预计:
[
{
"id": 123
"name": "Scruffy"
"tag": "Chuck's pup"
}
]
实际:[{}]
如何重现
- 在本地克隆代码(git 克隆 ....)
- 导航到根目录 (cd ......)
- 运行 一个 gradle 构建(gradle 干净构建)
- 导航到 reading-comprehension-server-impl (cd reading-comprehension-server-impl)
- 运行 docker 构建(docker 构建 .-t .... 或者 运行 ./docker-build.sh) <-- 此步骤将占用一点时间和内存,因此可能会关闭其他应用程序
- 运行刚刚构建的docker镜像(docker运行-p8080:8080reading-comprehension-server-impl)
- 向服务器发出获取请求(http://localhost:8080/pets?limit=4)
我有想法
我很好奇的一些事情包括:
- 这可能是 (gradle) 范围问题吗?我应该使用 api 而不是 @Introspected 注释的实现(只是为了看看它是否有效)?
- 这可能是在另一个 module/jar 中生成的模型的问题吗?我是否应该将这一代移动到同一个项目(只是为了看看它是否有效)?
- 这可能是跨模块的不同 micronaut 版本的问题吗?
- 我是否可以通过某种方式注入(或以其他方式)获取对 bean 序列化程序的引用以进一步调试?
其他探索
- 我将其中一个端点修改为 return 来自同一模块的对象模型(只是一个虚拟响应),并且 return 以正确的格式编辑....所以它可能要么是版本问题,要么是构建问题(因为它在另一个模块中)
- 我修改了包含的模块以使用相同的 micronaut 版本(目前为 1.3.0,以后想升级到 2.x.x),但仍然没有正确序列化
- 我创建了一个 class 的副本,试图在响应主体中序列化到这个模块中,并且成功了(请参阅 NotARealPet.java)。现在的问题是,我可以配置它来工作,还是我应该(暂时)更改 api 以在该项目的构建目录中生成?
我找到了答案。即使 class 是使用 @Introspected 编译的,graal vm(native-image cli)也不会查看那些 classes。为了包括这些,我最终包括了一个 class 指定内省这些 classes @Introspected(classes = { Pet.class, Error.class} )
如果有人感兴趣,我会 post 带有示例的 gitlab link
问题描述 我有一个项目,我正在使用 micronaut 构建 RESTful api。响应正文中 returned 的模型是从开放的 api 规范(使用 gradle 插件)生成的。
但是,出于某种原因,micronaut 总是 return 将任何模型对象作为空 json 对象 {},即使它应该是填充对象。
存储库Link https://gitlab.com/connorbutch/open-api-micronaut-quarkus
输出示例
预计:
[
{
"id": 123
"name": "Scruffy"
"tag": "Chuck's pup"
}
]
实际:[{}]
如何重现
- 在本地克隆代码(git 克隆 ....)
- 导航到根目录 (cd ......)
- 运行 一个 gradle 构建(gradle 干净构建)
- 导航到 reading-comprehension-server-impl (cd reading-comprehension-server-impl)
- 运行 docker 构建(docker 构建 .-t .... 或者 运行 ./docker-build.sh) <-- 此步骤将占用一点时间和内存,因此可能会关闭其他应用程序
- 运行刚刚构建的docker镜像(docker运行-p8080:8080reading-comprehension-server-impl)
- 向服务器发出获取请求(http://localhost:8080/pets?limit=4)
我有想法 我很好奇的一些事情包括:
- 这可能是 (gradle) 范围问题吗?我应该使用 api 而不是 @Introspected 注释的实现(只是为了看看它是否有效)?
- 这可能是在另一个 module/jar 中生成的模型的问题吗?我是否应该将这一代移动到同一个项目(只是为了看看它是否有效)?
- 这可能是跨模块的不同 micronaut 版本的问题吗?
- 我是否可以通过某种方式注入(或以其他方式)获取对 bean 序列化程序的引用以进一步调试?
其他探索
- 我将其中一个端点修改为 return 来自同一模块的对象模型(只是一个虚拟响应),并且 return 以正确的格式编辑....所以它可能要么是版本问题,要么是构建问题(因为它在另一个模块中)
- 我修改了包含的模块以使用相同的 micronaut 版本(目前为 1.3.0,以后想升级到 2.x.x),但仍然没有正确序列化
- 我创建了一个 class 的副本,试图在响应主体中序列化到这个模块中,并且成功了(请参阅 NotARealPet.java)。现在的问题是,我可以配置它来工作,还是我应该(暂时)更改 api 以在该项目的构建目录中生成?
我找到了答案。即使 class 是使用 @Introspected 编译的,graal vm(native-image cli)也不会查看那些 classes。为了包括这些,我最终包括了一个 class 指定内省这些 classes @Introspected(classes = { Pet.class, Error.class} )
如果有人感兴趣,我会 post 带有示例的 gitlab link