Spring Integration中HttpRequestHandlingMessagingGateway上传XML文件空消息问题
问题解决:Spring Integration HTTP网关接收Multipart请求时Message为空的处理
1. 修复日志打印问题
你当前的日志代码LOGGER.info("message ", message);不会输出message内容,因为缺少占位符匹配。改为:
LOGGER.info("Received message: {}", message);
这样才能正确打印消息详情,确认是否真的为空。
2. 获取原生HttpServletRequest查看请求内容
Spring Integration会将原生的HttpServletRequest存入消息头的HttpHeaders.REQUEST(即"request")属性中,你可以直接从消息头取出查看完整请求:
@ServiceActivator(inputChannel = "Inbound_GATEWAY_in") public Message<?> headerEnrich_Inbound_GATEWAY_in(Message<?> message){ // 获取原生请求 HttpServletRequest request = (HttpServletRequest) message.getHeaders().get(HttpHeaders.REQUEST); // 打印请求参数 Enumeration<String> paramNames = request.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = paramNames.nextElement(); LOGGER.info("Request param: {} = {}", paramName, request.getParameter(paramName)); } // 解析Multipart文件 if (request instanceof MultipartHttpServletRequest) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) { MultipartFile file = entry.getValue(); LOGGER.info("Received file: {}, size: {}", file.getOriginalFilename(), file.getSize()); // 读取XML文件内容 try { String xmlContent = new String(file.getBytes(), StandardCharsets.UTF_8); LOGGER.info("XML content:\n{}", xmlContent); } catch (IOException e) { LOGGER.error("Failed to read XML file", e); } } } // 后续处理逻辑... return message; }
3. 从Message Payload中直接获取XML文件
默认情况下,HttpRequestHandlingMessagingGateway会将Multipart请求解析为MultiValueMap<String, Object>作为消息Payload,其中包含表单参数和MultipartFile类型的文件对象。你可以直接解析Payload:
@ServiceActivator(inputChannel = "Inbound_GATEWAY_in") public Message<?> headerEnrich_Inbound_GATEWAY_in(Message<?> message){ Object payload = message.getPayload(); if (payload instanceof MultiValueMap) { MultiValueMap<String, Object> multipartData = (MultiValueMap<String, Object>) payload; // 注意:这里的"file"是你表单中文件字段的名称,需要和上传请求的字段名一致 List<Object> fileList = multipartData.get("file"); if (fileList != null) { for (Object fileObj : fileList) { if (fileObj instanceof MultipartFile) { MultipartFile xmlFile = (MultipartFile) fileObj; // 处理XML文件,比如解析为DOM对象 try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document xmlDoc = builder.parse(xmlFile.getInputStream()); // 后续XML处理逻辑... LOGGER.info("Successfully parsed XML file: {}", xmlFile.getOriginalFilename()); } catch (Exception e) { LOGGER.error("Error parsing XML file", e); } } } } } // 后续处理逻辑... return message; }
4. 确保消息转换器支持Multipart类型
如果你的messageConverter()方法没有配置支持Multipart的转换器,可能导致Payload解析失败。建议添加AllEncompassingFormHttpMessageConverter:
@Bean public List<HttpMessageConverter<?>> messageConverter() { List<HttpMessageConverter<?>> converters = new ArrayList<>(); converters.add(new AllEncompassingFormHttpMessageConverter()); // 可添加其他转换器,比如JSON转换器 converters.add(new MappingJackson2HttpMessageConverter()); return converters; }
内容的提问来源于stack exchange,提问作者Santrupta Dash
相关产品推荐
相关产品推荐

