Jakarta与RestEasy多附件REST API构建问题及批量获取方案咨询
解决RestEasy MultipartFormDataInput批量获取数组型附件的问题
问题原因
你用uploadForm.get("attachments")返回null,是因为前端提交的附件字段采用了attachments[0][fileType]这种索引嵌套格式,RestEasy不会自动将这类键映射为一个完整的attachments数组对象,直接通过键名attachments无法匹配到任何表单数据。
批量获取附件的解决方案
要批量提取所有附件(哪怕超过10个),需要手动遍历表单的所有字段,通过解析键名中的索引值,将同索引的字段归为一个附件对象。具体实现步骤如下:
- 定义附件实体类
先创建对应附件结构的实体类,用来存储每个附件的详情:
public class Attachment { private String fileType; private String fileName; private InputStream file; // 省略getter、setter方法 }
- 遍历表单并分组解析
通过MultipartFormDataInput的getFormDataMap()获取所有表单条目,利用正则匹配键名中的索引和字段名,将同索引的字段组装成一个Attachment对象:
// 初始化Map,按索引存储对应附件 Map<Integer, Attachment> attachmentMap = new HashMap<>(); // 遍历所有表单键值对 for (Map.Entry<String, List<InputPart>> entry : uploadForm.getFormDataMap().entrySet()) { String key = entry.getKey(); // 匹配attachments[N][field]格式的键名 Pattern pattern = Pattern.compile("attachments\\[(\\d+)\\]\\[(\\w+)\\]"); Matcher matcher = pattern.matcher(key); if (matcher.find()) { int index = Integer.parseInt(matcher.group(1)); String fieldName = matcher.group(2); InputPart inputPart = entry.getValue().get(0); // 若当前索引无Attachment实例则创建 Attachment attachment = attachmentMap.computeIfAbsent(index, k -> new Attachment()); // 根据字段名赋值 switch (fieldName) { case "fileType": attachment.setFileType(inputPart.getBodyAsString()); break; case "fileName": attachment.setFileName(inputPart.getBodyAsString()); break; case "file": // 获取文件输入流 InputStream fileStream = inputPart.getBody(InputStream.class, null); attachment.setFile(fileStream); break; } } } // 将Map转为按索引排序的List List<Attachment> attachments = attachmentMap.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .map(Map.Entry::getValue) .collect(Collectors.toList());
这种方式不限制附件数量,只要前端保持attachments[N][字段]的提交格式,就能正确解析所有附件。
当前代码是否适用?
如果你的当前代码仅依赖uploadForm.get("attachments")来获取附件,那完全不适用——RestEasy无法自动识别这种嵌套索引格式的字段组。必须改用上述遍历解析的方式,才能正确批量获取附件详情。
内容的提问来源于stack exchange,提问作者Abheek Das
相关产品推荐
相关产品推荐

