在使用try-catch资源在Servlet中提交响应后无法转发

时间:2019-03-05 13:42:52

标签: java servlets

以下方法引发:Servlet DetailCakeServlet的Servlet.service()引发异常
const lastModifiedBy = Symbol.for('lastModifiedBy'); // later app.getAsync(async (req, res) => { const doc = await MyModel.findOne({ _id: req.params.id }); doc[lastModifiedBy] = req.params.staffId; // Can now access `this[lastModifiedBy]` in save middleware: https://mongoosejs.com/docs/middleware.html await doc.save(); });

代码

java.lang.IllegalStateException: Cannot forward after response has been committed.

但是当我删除资源不足对象时,它就起作用了。可能是什么原因?

2 个答案:

答案 0 :(得分:0)

here所述(在规范中尚未快速找到),在进入catch块之前,try-with-resources构造将尝试关闭try块内打开的资源。 -即,当您尝试在out块中进行重定向时,您的responsecatch已经关闭。我建议通过以下方式处理可能的异常:

try (PrintWriter out = response.getWriter()) {
  try {
    CakeDAO dao = new CakeDAO();
    String strID = request.getParameter("id");
    int id = Integer.parseInt(strID);
    request.setAttribute("cake", dao.getCakeById(id));
    request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
  }catch (Exception ex) {
    request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
  }
}

实际上,我在您的代码中看不到out的任何使用,因此整个try-with-resources块只是多余的。

答案 1 :(得分:0)

在没有输出的情况下进行转发:

try {
    CakeDAO dao = new CakeDAO();
    String strID = request.getParameter("id");
    int id = Integer.parseInt(strID);
    request.setAttribute("cake", dao.getCakeById(id));
    request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
} catch (Exception ex) {
    request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}

或这样做:

try {
    CakeDAO dao = new CakeDAO();
    String strID = request.getParameter("id");
    int id = Integer.parseInt(strID);
    PrintWriter out = response.getWriter();
    out.println("Cake: " + dao.getCakeById(id)); // Hereafter an exception would err.
    // NEVER forward: ... .forward(request, response);
} catch (Exception ex) {
    request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}

试用资源会自动关闭,不需要。转发时甚至会引发错误。

更重要的是,没有让作家更好。在实际写入输出(缓冲的I / O!)之后,转发是错误的,因此catch中的转发很脏。