Java 获取Spring应用程序中的HttpServetRequest正文数据

Java 获取Spring应用程序中的HttpServetRequest正文数据,java,spring,spring-mvc,tomcat,servlets,Java,Spring,Spring Mvc,Tomcat,Servlets,我有一个spring应用程序,里面有一些servlet。这些请求都与ServletComponentScan一样连接并使用,但在Servlet中,当它尝试使用“getInputStream”或其他什么时,它不会返回任何数据。我猜这是因为Spring首先读取主体,数据只能读取一次。有没有办法让它正常工作 @WebServlet(urlPatterns={"/servlet"}) public class ServletController extends HttpServlet { pr

我有一个spring应用程序,里面有一些servlet。这些请求都与ServletComponentScan一样连接并使用,但在Servlet中,当它尝试使用“getInputStream”或其他什么时,它不会返回任何数据。我猜这是因为Spring首先读取主体,数据只能读取一次。有没有办法让它正常工作

@WebServlet(urlPatterns={"/servlet"})
public class ServletController extends HttpServlet {

    private static final Logger logger = LoggerFactory.getLogger(ServletController.class);

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();

        String bodyData = extractBody(req);

        out.println("BodyData: " + bodyData);
    }

    public static String extractBody(HttpServletRequest request) {
        StringBuffer sb = new StringBuffer();
        String line = null;
        BufferedReader reader = null;
        try {
            InputStreamReader isr = new InputStreamReader(request.getInputStream());
            reader = new BufferedReader(isr);

            int i;
            while ((i = reader.read()) != -1) {
                sb.appendCodePoint(i);
            }
        } catch (Exception e) {
            logger.error("Failed to read from servletRequest with content-length: {}", request.getHeader("Content-Length"));
            e.printStackTrace();
        }
        return sb.toString();
    }
}
上面是一个例子,当它自己在tomcat或其他任何东西中时,它是好的。当它出现在与Spring相关的应用程序中时,它就不起作用了

弹簧

$ curl -X POST -d'{}' http://localhost:8080/servlet
BodyData:
普通Servlet(内置于“plainservlet.war”中并部署到tomcat)


。。。这很愚蠢,但答案似乎是Spring实际上正在验证请求,而普通servlet则没有(duh)。它需要适当的标题和内容

$ curl -X POST -d'{}' -H "Content-type: application/json" http://localhost:8080/servlet
BodyData: {}
$ curl -X POST -d'{}' -H "Content-type: application/json" http://localhost:8080/servlet
BodyData: {}