Struts2获取请求对象为null

时间:2010-08-26 09:23:37

标签: tomcat servlets struts2

我在Struts2中遇到一个奇怪的错误,我在尝试将属性设置为请求范围时遇到空指针异常,

Struts Problem Report
  

Struts检测到未处理   异常:消息:文件:     组织/阿帕奇/卡塔利娜/连接器/ Request.java   行号:1,424

Stacktraces
java.lang.NullPointerException
    org.apache.catalina.connector.Request.setAttribute(Request.java:1424)
    org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:503)
    javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:284)
    com.inrev.bm.action.IRBrandMgmtAction.wrdTwts(IRBrandMgmtAction.java:81)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)

我的代码如下,

public class IRBrandMgmtAction extends ActionSupport implements SessionAware,ServletRequestAware {


private static final long serialVersionUID = 1L;

private Map session;

private HttpServletRequest request; 

private IRWordToTrack wrdtotrack;

private IRBrandMgmtDAO brandMgmtDAO;

private static org.apache.log4j.Logger log = Logger.getLogger(IRBrandMgmtAction.class);

以及发生这种情况的方法,

public String wrdTwts()
{
    ArrayList<IRBrandTrackBean> messages = null;
    IRDateUtil dtUtil = new IRDateUtil();
    String wordId = request.getParameter("wordId");

    IRUser user = (IRUser) session.get("user");
    IRWordToTrack word = brandMgmtDAO.getWord(Integer.parseInt(wordId));

    if(word!=null)
    {
        messages = brandMgmtDAO.viewMsgForUser(word.getWord().toUpperCase().trim(), null, dtUtil.getTimeZoneOffset(user.getTimeZone()));
    }

    request.setAttribute("messages",messages);

    return "tweets";
}

我正在使用tomcat 6服务器。

此致 罗希特夏尔

3 个答案:

答案 0 :(得分:1)

很难知道问题的原因,但我想到了三个建议:

  • 也许这是一个Tomcat错误,升级到最新版本。
  • 确保您在Request / Session上下文中放置的对象是小bean,没有引用其他对象。
  • 您的代码有几种气味。在Struts2中,您应该(几乎)永远不会访问HttpRequest对象(很少会话)。 Struts2的观点是(几乎)完全将您的操作与Servlet层分离;这样可以简化测试,一般会让您高兴。您的操作方法通常应该读取自己的字段(通常已经通过“param拦截器”从http请求设置),与服务层对话,设置一些其他自己的字段并返回结果。在Struts2方法中设置httprequest几乎总是一种不好的做法。

答案 1 :(得分:1)

创建动作类RequestAware而不是ServletRequestAware可能是一个想法。

在您当前的代码中,您确定正在调用setServletRequest方法吗?您是否定义了导致默认拦截器被丢弃的任何自定义拦截器?在Session / Request意识到的情况下,我们对ServletConfigInterceptor感兴趣。

答案 2 :(得分:0)

使用, PhantomData PhantomData

获取请求和响应。

OR

首先调用此ServletActionContext.getResponse();