NullPointerException设置属性时?

例如,我有一个将属性设置为HttpServletRequest的Servlet代码:

request.setAttribute("someValue", someValue());

RequestDispatcher rd = getServletContext().getRequestDispatcher("/SomeJsp.jsp");

rd.forward(this.request, this.response);

return;

如何确保上面的代码是线程安全的?

这是我得到的堆栈跟踪:

java.lang.NullPointerException

at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1552)

at org.apache.catalina.connector.Request.access$000(Request.java:105)

at org.apache.catalina.connector.Request$3.set(Request.java:3342)

at org.apache.catalina.connector.Request.setAttribute(Request.java:1504)

at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:541)

at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:286)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)

at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)

at com.mycompany.myapp.servlet.SomeServlet.doRequest(SomeServlet.java:103)

at com.mycompany.myapp.servlet.SomeServlet.doGet(SomeServlet.java:159)

回答:

rd.forward(this.request, this.response);

这个(双关语意)建议您已分配一个类的实例变量,request并将其response作为实例变量。您的具体问题又提示该类本身的实例不是线程安全的。

假设它实际上是servlet本身,那么就可以确定问题的原因。Servlet根本不是线程安全的。在webapp启动期间,仅创建了一个实例,然后在 整个

应用程序的 所有 请求之间共享。

你应该

分配请求或会话范围的数据作为servlet的一个实例变量。仅当同时发生另一个HTTP请求时,才会覆盖它。遇到您自己时,这会使您的代码不安全。

以下代码说明了这一点:

public class MyServlet extends HttpServlet {

private Object thisIsNOTThreadSafe;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Object thisIsThreadSafe;

thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!

thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.

}

}

将HTTP请求本身分配为servlet的实例变量实际上是一个重大错误。当用户Y在Servlet处理用户X的请求的同时激发另一个请求时,用户X将立即获得用户Y

requestresponse对象。这绝对是线程不安全的。造成NPE的原因request是,在那一刻,用户Y的处理“完成”,因此释放/销毁了。

以上是 NullPointerException设置属性时? 的全部内容, 来源链接: utcz.com/qa/409448.html

回到顶部