title: Reading httprequest content from spring exception handler
body: <p>I Am using Spring's <code>@ExceptionHandler</code> annotation to catch exceptions in my controllers.</p>
  
  <p>Some requests hold POST data as plain XML string written to the request body, I want to read that data in order to log the exception.
  The problem is that when i request the inputstream in the exception handler and try to read from it the stream returns -1 (empty).</p>
  
  <p>The exception handler signature is:</p>
  
  <pre><code>@ExceptionHandler(Throwable.class)
  public ModelAndView exception(HttpServletRequest request, HttpServletResponse response, HttpSession session, Throwable arff)
  </code></pre>
  
  <p>Any thoughts? Is there a way to access the request body?</p>
  
  <p>My controller: </p>
  
  <pre><code>@Controller
  @RequestMapping("/user/**")
  public class UserController {
  
      static final Logger LOG = LoggerFactory.getLogger(UserController.class);
  
      @Autowired
      IUserService userService;
  
  
      @RequestMapping("/user")
      public ModelAndView getCurrent() {
          return new ModelAndView("user","response", userService.getCurrent());
      }
  
      @RequestMapping("/user/firstLogin")
      public ModelAndView firstLogin(HttpSession session) {
          userService.logUser(session.getId());
          userService.setOriginalAuthority();
          return new ModelAndView("user","response", userService.getCurrent());
      }
  
  
      @RequestMapping("/user/login/failure")
      public ModelAndView loginFailed() {
          LOG.debug("loginFailed()");
          Status status = new Status(-1,"Bad login");
          return new ModelAndView("/user/login/failure", "response",status);
      }
  
      @RequestMapping("/user/login/unauthorized")
      public ModelAndView unauthorized() {
          LOG.debug("unauthorized()");
          Status status = new Status(-1,"Unauthorized.Please login first.");
          return new ModelAndView("/user/login/unauthorized","response",status);
      }
  
      @RequestMapping("/user/logout/success")
      public ModelAndView logoutSuccess() {
          LOG.debug("logout()");
          Status status = new Status(0,"Successful logout");
          return new ModelAndView("/user/logout/success", "response",status);
  
      }
  
      @RequestMapping(value = "/user/{id}", method = RequestMethod.POST)
      public ModelAndView create(@RequestBody UserDTO userDTO, @PathVariable("id") Long id) {
          return new ModelAndView("user", "response", userService.create(userDTO, id));
      }
  
      @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
      public ModelAndView getUserById(@PathVariable("id") Long id) {
          return new ModelAndView("user", "response", userService.getUserById(id));
      }
  
      @RequestMapping(value = "/user/update/{id}", method = RequestMethod.POST)
      public ModelAndView update(@RequestBody UserDTO userDTO, @PathVariable("id") Long id) {
          return new ModelAndView("user", "response", userService.update(userDTO, id));
      }
  
      @RequestMapping(value = "/user/all", method = RequestMethod.GET)
      public ModelAndView list() {
          return new ModelAndView("user", "response", userService.list());
      }
  
      @RequestMapping(value = "/user/allowedAccounts", method = RequestMethod.GET)
      public ModelAndView getAllowedAccounts() {
          return new ModelAndView("user", "response", userService.getAllowedAccounts());
      }
  
      @RequestMapping(value = "/user/changeAccount/{accountId}", method = RequestMethod.GET)
      public ModelAndView changeAccount(@PathVariable("accountId") Long accountId) {
          Status st = userService.changeAccount(accountId);
          if (st.code != -1) {
              return getCurrent();
          }
          else {
              return new ModelAndView("user", "response", st);
          }
      }
      /*
      @RequestMapping(value = "/user/logout", method = RequestMethod.GET)
      public void perLogout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          userService.setOriginalAuthority();
          response.sendRedirect("/marketplace/user/logout/spring");
      }
       */
  
      @ExceptionHandler(Throwable.class)
  public ModelAndView exception(HttpServletRequest request, HttpServletResponse response, HttpSession session, Throwable arff) {
      Status st = new Status();
      try {
          Writer writer = new StringWriter();
          byte[] buffer = new byte[1024];
  
          //Reader reader2 = new BufferedReader(new InputStreamReader(request.getInputStream()));
          InputStream reader = request.getInputStream();
          int n;
          while ((n = reader.read(buffer)) != -1) {
              writer.toString();
  
          }
          String retval = writer.toString();
          retval = "";
          } catch (IOException e) {
  
              e.printStackTrace();
          }
  
          return new ModelAndView("profile", "response", st);
      }
  }
  </code></pre>
  
  <p>Thank you</p>