天天看點

can not be cast to javax.servlet.Filter等問題的解決方法

問題1:can not be cast to javax.servlet.Filter

  一位從測試轉開發的同僚首次更新代碼,并編譯在本地啟動web項目時,報如下錯誤:

Exception starting filter encodingFilter

java.lang.ClassCastException:com.gaochao.platform.web.context.filter.ContextFilter2 can not be cast to javax.servlet.Filter

1

2

3

4

5

6

7

8

9

10

11

12

<code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>groupId</code><code>&gt;javax.servlet&lt;/</code><code>groupId</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>artifactId</code><code>&gt;servlet-api&lt;/</code><code>artifactId</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>version</code><code>&gt;${servlet-version}&lt;/</code><code>version</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>scope</code><code>&gt;provided&lt;/</code><code>scope</code><code>&gt;</code>

<code>            </code><code>&lt;/</code><code>dependency</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>artifactId</code><code>&gt;jsp-api&lt;/</code><code>artifactId</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>version</code><code>&gt;${jsp-version}&lt;/</code><code>version</code><code>&gt;</code>

  順着這個思路,我查找了關于&lt;scope&gt;标簽的用法,如下:

* compile,預設值,适用于所有階段,會随着項目一起釋出。 

* provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。 

* runtime,隻在運作時使用,如JDBC驅動,适用運作和測試階段。 

 * test,隻在測試時使用,用于編譯和運作測試代碼。不會随項目釋出。 

 * system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。

My issue was introduced by gwt-user.jar that contains javax.servlet package.

Setting it as provided solved the issue.

  我的問題是引入gwt-user.jar,而該包中包含servlet,将該包(也可能是該包中依賴servlet)的scope改為provided即ok了。目前我們的項目裡引入百數十個包,裡面是不是包含servlet查找起來将是較大的工程。另外,除了這名同僚以外,其他同僚的tomcat啟動是不是問題的。是以以上的描述隻是解決類似問題的一個思路,但并不是我們問題産生的原因。

  如下:

13

14

15

16

17

18

19

<code>&lt;</code><code>dependency</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>groupId</code><code>&gt;net.paoding&lt;/</code><code>groupId</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>artifactId</code><code>&gt;paoding-rose&lt;/</code><code>artifactId</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>version</code><code>&gt;1.0-SNAPSHOT&lt;/</code><code>version</code><code>&gt;  </code>

<code>            </code><code>&lt;</code><code>exclusions</code><code>&gt;  </code>

<code>            </code><code>&lt;</code><code>exclusion</code><code>&gt;  </code>

<code>                </code><code>&lt;</code><code>groupId</code><code>&gt;javax.servlet&lt;/</code><code>groupId</code><code>&gt;  </code>

<code>                </code><code>&lt;</code><code>artifactId</code><code>&gt;servlet-api&lt;/</code><code>artifactId</code><code>&gt;  </code>

<code>            </code><code>&lt;/</code><code>exclusion</code><code>&gt;  </code>

<code>        </code><code>&lt;/</code><code>exclusions</code><code>&gt;  </code>

<code>    </code><code>&lt;/</code><code>dependency</code><code>&gt;      </code>

<code>    </code><code>&lt;</code><code>dependency</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>groupId</code><code>&gt;javax.servlet&lt;/</code><code>groupId</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>artifactId</code><code>&gt;servlet-api&lt;/</code><code>artifactId</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>version</code><code>&gt;2.3&lt;/</code><code>version</code><code>&gt;  </code>

<code>        </code><code>&lt;</code><code>scope</code><code>&gt;provided&lt;/</code><code>scope</code><code>&gt;  </code>

<code>    </code><code>&lt;/</code><code>dependency</code><code>&gt;  </code>

<code>  </code><code>&lt;/</code><code>dependencies</code><code>&gt;  </code>

<code>        </code><code>&lt;/</code><code>dependencies</code><code>&gt;</code>

  以上是三種通過網際網路查詢的方案,未解決問題;又通過解除安裝jdk、tomcat、maven并重裝等等。最終發現采用jetty可以啟動項目。最後的解決方案,即為:重裝機器,重新部署環境。

問題2:MYSQL裡的ISNULL、IFNULL、NULLIF

  在對工作流曆史任務進行查詢時,曆史任務的審批人存儲的使用者表中的使用者code,需要left join 使用者表将對應的使用者名稱。如下:

<code>&lt;!-- 查詢集合審批曆史  --&gt;</code>

<code>    </code><code>&lt;</code><code>select</code> <code>id</code><code>=</code><code>"queryByProcessExecutionIdForPage"</code> <code>resultMap</code><code>=</code><code>"TaskResultMap"</code>  <code>parameterType</code><code>=</code><code>"String"</code><code>&gt;</code>

<code>        </code><code>SELECT </code>

<code>            </code><code>task.processExecutionId,</code>

<code>            </code><code>process.name as processDefineName,</code>

<code>            </code><code>task.activityName,</code>

<code>            </code><code>user.userName as createUserCode,</code>

<code>            </code><code>task.status,</code>

<code>            </code><code>task.description,</code>

<code>            </code><code>task.finishTime,</code>

<code>            </code><code>task.createTime</code>

<code>        </code><code>FROM T_BPM_PROCESS_TASK task</code>

<code>        </code><code>LEFT JOIN T_BPM_PROCESS_EXECUTION execution ON task.processExecutionId = execution.id</code>

<code>        </code><code>LEFT JOIN t_bpm_process_define process ON execution.processDefineId = process.id</code>

<code>        </code><code>LEFT JOIN T_SYS_USER user ON task.createUserCode = user.userCode</code>

<code>        </code><code>WHERE task.processExecutionId = #{id}</code>

<code>        </code><code>ORDER BY task.createTime DESC, task.finishTime DESC</code>

<code>    </code><code>&lt;/</code><code>select</code><code>&gt;</code>

  而在搶辦,也就是jbpm4_task的assignee為空,而jbpm4_participation中的參與類型為Candidate時,即形成所有參與人共同參與,均為候選審批人,一人審批結束,則該任務辦理通過。由于assignee為空,無法像普通任務那樣直接關聯查詢,是以使用ISNULL函數,如下:

<code>ISNULL</code><code>(</code><code>user</code><code>.userName,</code><code>"搶辦"</code><code>) </code><code>as</code> <code>createUserCode</code>

<code>IFNULL(expr1,expr2)</code>

如果expr1不是NULL,IFNULL()傳回expr1,否則它傳回expr2。IFNULL()傳回一個數字或字元串值,取決于它被使用的上下文環境。

<code>NULLIF</code><code>(expr1,expr2)</code>

  如果expr1= expr2  成立,那麼傳回值為NULL,否則傳回值為 expr1。

  通過以上介紹,對于NULLIF為何如此命名感覺很奇怪,似乎與參數null與否無關。在MYSQL中我們就可以使用IFNULL來代替IFNULL實作我們想要的功能,修改後如下:

  修改後經測試,可以達到我們想要的結果。

問題3:MySQL關于txt格式字段的優化

  在建立工作中,會查詢出所有流程定義的list,随着新的流程表單不斷上線,打開所有流程清單的動作越來越耗時。在查詢語句中使用的select * from字樣,在流程定義所有的屬性中包括了text格式的jpdlXml屬性,該屬性中存儲了該流程的xml定義的文本。因為該查詢隻需列出流程的id、分類、名稱,其他屬性是不必須的,将jpdlXml從select屬性清單中移除,這也是sql優化的一個基礎性的常識,不需要的字段就不要寫進select。将jpdlXml移除後,耗時較長的問題并沒有明顯改善。我們繼續向下閱讀,發現還有另外一處,在查詢出所有流程定義list後,會對該list進行篩選,之前的博文對這一處的邏輯進行過基于責任鍊模式的優化。其篩選邏輯中有這麼一條——流程新釋出或表單新儲存後會更新流程/表單的某個字段,根據該字段決定建立工作中該流程是否可見。在此處代碼裡,會對所有流程定義list進行周遊,然後拿到流程對應的form,而查詢該form時,也是使用的select *,而在form的定義表中,有兩個字段是text類型的,分别為html和template。我們再将這兩個非必須字段移除,耗時問題明顯改善,使用者幾無等待就可以看到所有流程的清單。

  這一問題給我們的提示就是,查詢動作盡量不用*。

問題4:tools.jar not found

  為解決問題2,我也嘗試在我的筆記本裡(已經有一個桌上型電腦和隻有顯示器連接配接雲伺服器的VDI盒子,因經常開會,新申請的筆記本電腦,用于遠端連接配接桌上型電腦,一直沒有安裝開發環境),拉取新的代碼,按照開發環境配置新的環境,包括jdk、tomcat等,在部署的時候,報出如下錯誤:

Fatal error compiling: tools.jar not found: C:\Program Files\Java\jre6\..\lib\tools.jar.

  網上一般對該問題的定義是eclipse中的jre配置jdk中的jre,而正确的配置應該是jdk。查找後發現并沒有配置錯。最後檢視環境變量配置,Win+R打開cmd,輸入 java -version,并沒有輸出版本資訊,發現環境變量配置有誤。

  修複完畢後,再次deploy沒有再發現該問題。

     本文轉自 gaochaojs 51CTO部落格,原文連結:http://blog.51cto.com/jncumter/1619492,如需轉載請自行聯系原作者