Quarkus中如何将InputStream转换为Multipart Form对象?
问题描述
我已经在应用中集成了SendGrid的Inbound Parse功能,当前资源类代码如下:
@POST @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.MULTIPART_FORM_DATA) public Uni<Response> consumeMail(@Context HttpHeaders headers, InputStream inputStream) throws IOException { log.info("Received new email"); log.info("Request headers"); try (inputStream) { var bytes = inputStream.readAllBytes(); log.infof("Data length %s", bytes.length); var mail = mailProcessService.saveMail(bytes); // How to convert bytes array to EmailFormData? } return Uni.createFrom().item(Response.accepted().build()); }
目前我不清楚如何在Quarkus中将InputStream转换为multipart/form-data类型的EmailFormData对象,请问该操作是否可行?相关实体类代码如下:
public class EmailFormData { @FormParam("dkim") @PartType(MediaType.TEXT_PLAIN) public String dkim; @FormParam("email") @PartType(MediaType.TEXT_PLAIN) public String email; @FormParam("to") @PartType(MediaType.TEXT_PLAIN) public String to; @FormParam("from") @PartType(MediaType.TEXT_PLAIN) public String from; }
解决方案
完全可行,而且Quarkus基于JAX-RS规范,已经提供了自动绑定multipart/form-data到实体类的能力,不需要手动处理InputStream和字节数组,具体步骤如下:
确认依赖到位
先确保项目引入了Quarkus的multipart支持依赖:
Maven(pom.xml):<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-multipart</artifactId> </dependency>Gradle(
build.gradle):implementation 'io.quarkus:quarkus-resteasy-multipart'修改资源方法参数
直接把InputStream替换为EmailFormData作为方法参数,框架会自动解析multipart请求并填充实体类字段:@POST @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.MULTIPART_FORM_DATA) public Uni<Response> consumeMail(@Context HttpHeaders headers, EmailFormData emailFormData) { log.info("Received new email"); log.info("Request headers"); // 直接使用实体类中的字段 log.info("From: {}", emailFormData.from); log.info("To: {}", emailFormData.to); log.info("DKIM: {}", emailFormData.dkim); log.info("Raw email content: {}", emailFormData.email); // 调用业务逻辑处理 mailProcessService.saveMail(emailFormData); return Uni.createFrom().item(Response.accepted().build()); }实体类优化(可选)
可以把实体类的公共字段改为私有,再添加getter/setter方法,符合Java编码规范:public class EmailFormData { @FormParam("dkim") @PartType(MediaType.TEXT_PLAIN) private String dkim; @FormParam("email") @PartType(MediaType.TEXT_PLAIN) private String email; @FormParam("to") @PartType(MediaType.TEXT_PLAIN) private String to; @FormParam("from") @PartType(MediaType.TEXT_PLAIN) private String from; // getter和setter方法 public String getDkim() { return dkim; } public void setDkim(String dkim) { this.dkim = dkim; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } }
如果确实需要手动解析InputStream(不推荐,框架的自动绑定已经足够稳定),可以使用Apache Commons FileUpload或者JAX-RS的MultipartFormDataInput手动处理,但这种方式冗余且容易出错,优先用上面的自动绑定方案。
内容的提问来源于stack exchange,提问作者Huy Phan
相关产品推荐
相关产品推荐

