2010-08-26 49 views
0

我面临在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服务器。

问候, 罗希特

回答

1

这是很难知道你的问题的原因,但三点建议浮现在脑海中:

  • 也许这是一个Tomcat错误,升级到最新版本。
  • 确保您在请求/会话上下文中放置的对象是小的bean,而不引用其他对象。
  • 你的代码有几种气味。在Struts2中,您应该(几乎)不会访问HttpRequest对象(并且很少会话)。 Struts2的要点是将您的操作从Servlet层彻底解耦(几乎);这简化了测试,并且总体上让你感到高兴。你的动作方法通常应该读取自己的字段(通常已经由“param拦截器”的http请求设置),与服务层交谈,设置其他自己的字段并返回结果。在Struts2方法中设置httprequest几乎总是一种不好的做法。
+0

感谢Leonbloy, 对于struts2来说,我真的很新,一直在使用struts1.2直到这个项目,感谢您的所有建议。只有几个问题想, *你会建议什么是在strust2中传递值的最好方法,定义getter setter? *当我使用这个HttpServletRequest request = ServletActionContext.getRequest()时,请求对象null的错误似乎不会发生。 你能抛出一些光吗? – sesmic 2010-08-28 17:54:21

1

这可能是一个想法,使您的操作类RequestAware而不是ServletRequestAware。

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