2017-06-01 49 views
0

我有一個在其中有一些servlet的spring應用程序。這些請求都是用ServletComponentScan連接起來的,但是在Servlet中,當它嘗試使用「getInputStream」或其他類型時,它不會返回任何數據。我猜測這是因爲Spring首先讀取數據並且數據只能被讀取一次。有沒有辦法使這個工作正常?在Spring應用程序中獲取HttpServetRequest正文數據

@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)

# curl -X POST -d'{}' http://localhost:8081/plainservlet/servlet 
BodyData: {} 

回答

0

...這是愚蠢的,但答案似乎是春天其實是驗證請求,而普通的servlet不(duh)。它需要適當的標題和內容。

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