問題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><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupId</code><code>>javax.servlet</</code><code>groupId</code><code>></code>
<code> </code><code><</code><code>artifactId</code><code>>servlet-api</</code><code>artifactId</code><code>></code>
<code> </code><code><</code><code>version</code><code>>${servlet-version}</</code><code>version</code><code>></code>
<code> </code><code><</code><code>scope</code><code>>provided</</code><code>scope</code><code>></code>
<code> </code><code></</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>artifactId</code><code>>jsp-api</</code><code>artifactId</code><code>></code>
<code> </code><code><</code><code>version</code><code>>${jsp-version}</</code><code>version</code><code>></code>
順着這個思路,我查找了關于<scope>标簽的用法,如下:
* 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><</code><code>dependency</code><code>> </code>
<code> </code><code><</code><code>groupId</code><code>>net.paoding</</code><code>groupId</code><code>> </code>
<code> </code><code><</code><code>artifactId</code><code>>paoding-rose</</code><code>artifactId</code><code>> </code>
<code> </code><code><</code><code>version</code><code>>1.0-SNAPSHOT</</code><code>version</code><code>> </code>
<code> </code><code><</code><code>exclusions</code><code>> </code>
<code> </code><code><</code><code>exclusion</code><code>> </code>
<code> </code><code><</code><code>groupId</code><code>>javax.servlet</</code><code>groupId</code><code>> </code>
<code> </code><code><</code><code>artifactId</code><code>>servlet-api</</code><code>artifactId</code><code>> </code>
<code> </code><code></</code><code>exclusion</code><code>> </code>
<code> </code><code></</code><code>exclusions</code><code>> </code>
<code> </code><code></</code><code>dependency</code><code>> </code>
<code> </code><code><</code><code>dependency</code><code>> </code>
<code> </code><code><</code><code>groupId</code><code>>javax.servlet</</code><code>groupId</code><code>> </code>
<code> </code><code><</code><code>artifactId</code><code>>servlet-api</</code><code>artifactId</code><code>> </code>
<code> </code><code><</code><code>version</code><code>>2.3</</code><code>version</code><code>> </code>
<code> </code><code><</code><code>scope</code><code>>provided</</code><code>scope</code><code>> </code>
<code> </code><code></</code><code>dependency</code><code>> </code>
<code> </code><code></</code><code>dependencies</code><code>> </code>
<code> </code><code></</code><code>dependencies</code><code>></code>
以上是三種通過網際網路查詢的方案,未解決問題;又通過解除安裝jdk、tomcat、maven并重裝等等。最終發現采用jetty可以啟動項目。最後的解決方案,即為:重裝機器,重新部署環境。
問題2:MYSQL裡的ISNULL、IFNULL、NULLIF
在對工作流曆史任務進行查詢時,曆史任務的審批人存儲的使用者表中的使用者code,需要left join 使用者表将對應的使用者名稱。如下:
<code><!-- 查詢集合審批曆史 --></code>
<code> </code><code><</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>></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></</code><code>select</code><code>></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,如需轉載請自行聯系原作者