2010-01-06 42 views
6

我不斷得到下面的錯誤對我的WebLogic 10.3控制檯日誌哪些危害是引起java.lang.IllegalStateException:響應已承諾

java.lang.IllegalStateException: Response already committed 
at weblogic.servlet.internal.ServletResponseImpl.objectIfCommitted(ServletResponseImpl.java: 
1462) 
at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:601) 
at org.apache.struts.action.RequestProcessor.processMapping(RequestProcessor.java:658) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:193) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) 

截斷。請參閱日誌文件的完整堆棧跟蹤

我想知道這是什麼造成的危害,如果不解決?在我加入團隊之前,這個錯誤一直存在於我的應用程序中,這是否足夠嚴重以符合「需要立即修復」?

回答

10

Struts是開源的。只是檢查之前的RequestProcessor源線658(如堆棧跟蹤指出):

// No mapping can be found to process this request 
String msg = getInternal().getMessage("processInvalid", path); 
log.error(msg); 
response.sendError(HttpServletResponse.SC_NOT_FOUND, msg); 

查看評論:No mapping can be found to process this request。這是問題的根源。但調用以顯示錯誤消息的sendError()也不能完成,因爲響應已經提交。顯然,有兩件事失敗:缺少一個映射,Struts映射的默認工作以不正確的方式在程序中被接管。

+0

(+1)在我看來,查看庫源代碼是快速調試與框架相關的問題的最佳方法。 – Bozho 2010-01-06 11:28:02

0

這意味着應用程序在發送響應之後嘗試發送HTTP標頭。這有什麼樣的危害取決於應用。

大多數情況下,瀏覽器可以容忍缺少的HTTP標頭,但是,例如,如果您要指定一個特殊的Content-Type,這可能會成爲問題。

不過,我建議你找到問題的根本原因,以避免任何混淆或「奇怪」的結果。

0

這取決於錯誤的含義是您已寫入您的HttpResponse對象並開始發送響應(通過調用flush(),sendError()或sendRedirect()),因此可能會添加任何響應流(或頭文件等),或者確實後續的操作(例如,您調用flush(),現在您調用sendError())將會丟失。

+0

請原諒我的經驗不足,但我不清楚。我們的struts應用程序有一些DispatchAction類,其中業務邏輯通過調用適當的BusinessDeleegators來執行,一旦一切正常,該方法通過在ActionMapping實例上調用findForward返回。你在這裏看到一個問題..? – 2010-01-06 11:00:34

+1

除非您的業務邏輯將消息發送到您的響應對象。我對struts並不太熟悉,所以我不能真正在這個級別做出明智的迴應,我只能說我的基本servlet經驗是我通過多次「提交」響應對象來看到這個錯誤。對不起,我不能有更多的幫助。 – 2010-01-06 11:25:36