2010-08-26 111 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感興趣。