You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在doPost中获取HttpServletRequestFilterable而非预期JSON的问题

问题:无法获取Mailgun Webhooks的JSON回调数据

我正在使用Mailgun Webhooks发送邮件,并用以下Servlet捕获回调信息:

public class MyServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, java.io.IOException {
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);
    printWriter.println("MyServlet");
    response.setContentType("text/plain");
    //response.setContentType("application/json");
    response.getOutputStream().print(stringWriter.toString());
  }

  @Override
  public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, java.io.IOException {
    System.out.println("HttpServletRequest below");
    System.out.println(request);
    System.out.println("HttpServletResponse below");
    System.out.println(response);
  }
}

但doPost方法的打印结果如下:

HttpServletRequest below
org.sitemesh.webapp.contentfilter.HttpServletRequestFilterable@4439aa1f

HttpServletResponse below
org.sitemesh.webapp.contentfilter.ContentBufferingFilter$1@4fa69476

根据Mailgun文档,他们应该会发送JSON响应,但我并未获取到,特此求助。


原因分析

  1. 直接打印HttpServletRequest对象输出的是它的默认toString()结果(类全名+内存哈希码),这是Java对象的正常行为,不代表没有收到回调数据。
  2. 你看到的HttpServletRequestFilterable是Sitemesh框架对原生Request的包装类,包装后的对象依然可以正常读取请求体内容。

解决方案

修改doPost方法,读取请求体中的JSON内容,而非直接打印Request对象:

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
    // 读取请求体中的JSON内容
    BufferedReader reader = request.getReader();
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
    String requestBody = sb.toString();
    
    // 打印获取到的JSON回调数据
    System.out.println("Mailgun回调JSON内容:");
    System.out.println(requestBody);
    
    // 可选:验证请求的内容类型
    String contentType = request.getContentType();
    System.out.println("请求内容类型:" + contentType);
    
    // 可选:将JSON解析为自定义对象(需引入Jackson/Gson等JSON解析库)
    // ObjectMapper mapper = new ObjectMapper();
    // MailgunWebhookPayload payload = mapper.readValue(requestBody, MailgunWebhookPayload.class);
}

额外检查项

  • 确认Servlet的映射路径正确,Mailgun后台配置的Webhook地址指向该Servlet的POST路径。
  • 排查Sitemesh等过滤器是否会拦截或修改请求体内容。
  • 可先用Postman等工具模拟发送携带JSON体的POST请求到Servlet,验证读取逻辑是否正常,排除Mailgun侧的配置问题。

内容的提问来源于stack exchange,提问作者Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:25:16