Quarkus结合Reasteasy-Reactive与JAX-RS时无法创建InputStream转换器
问题:Resteasy Reactive 中 Multipart 上传端点报错无法创建 InputStream 转换器
我编写了一个处理文件上传的 REST 端点,代码如下:
@POST @Path("/images") @Consumes("multipart/form-data") @Produces("application/json") fun upload(@FormParam(value = "file") fileInputStream: InputStream, @FormParam(value = "comment") comment: String): Response { anotherClass.save(fileInputStream, comment) return Response.ok().build() }
测试该端点时返回如下错误:
java.lang.RuntimeException: Could not create converter for java.io.InputStream for method javax.ws.rs.core.Response upload(java.io.InputStream fileInputStream, java.lang.String altText) on class SampleClass of type FORM at org.jboss.resteasy.reactive.server.processor.ServerEndpointIndexer.handleOtherParam(ServerEndpointIndexer.java:327) at org.jboss.resteasy.reactive.server.processor.ServerEndpointIndexer.handleOtherParam(ServerEndpointIndexer.java:92) at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.extractParameterInfo(EndpointIndexer.java:1341) at org.jboss.resteasy.reactive.common.processor.EndpointIndexer.createResourceMethod(EndpointIndexer.java:536) ... 14 more
尝试添加 resteasy-multipart 依赖无法解决问题,因为它与 resteasy-reactive 不兼容,求解决建议。
解决建议
使用
@MultipartForm封装表单数据
Resteasy Reactive 不支持直接通过@FormParam绑定InputStream类型的文件参数,需要用专门的@MultipartForm注解配合 DTO 类来处理:首先定义表单 DTO:
class ImageUploadForm { @FormParam("file") lateinit var file: InputStream @FormParam("comment") lateinit var comment: String }然后修改端点方法:
@POST @Path("/images") @Consumes("multipart/form-data") @Produces("application/json") fun upload(@MultipartForm form: ImageUploadForm): Response { anotherClass.save(form.file, form.comment) return Response.ok().build() }直接使用
@Part注解绑定单个参数
如果不想创建 DTO,也可以直接用@Part注解标记每个表单参数,文件参数还可以配合@PartType指定MIME类型:@POST @Path("/images") @Consumes("multipart/form-data") @Produces("application/json") fun upload( @Part("file") @PartType("application/octet-stream") fileInputStream: InputStream, @Part("comment") comment: String ): Response { anotherClass.save(fileInputStream, comment) return Response.ok().build() }确认引入正确的依赖
确保项目中使用的是 Resteasy Reactive 对应的 Multipart 依赖,比如在 Quarkus 项目中,应添加:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-reactive-multipart</artifactId> </dependency>不要引入传统的
resteasy-multipart,二者存在兼容性冲突。
内容的提问来源于stack exchange,提问作者PumpingSalad
相关产品推荐
相关产品推荐

