2015年7月13日 星期一

連線SSL URL出現錯誤 unable to find valid certification path to requested target

參考:SunCertPathBuilderException: unable to find valid certification path to requested target
InstallCert.java

這狀況挺奇怪的,運作已經半年以上的突然出了以下Exception:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExce
ption: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.
java:1478)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.jav
a:212)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:957)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:892)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.
java:1363)

出問題的地方在於我要連結一個https的路徑取回資料,參考解法步驟如下:

  1. 將上述連結InstallCert.java 的檔案拿回來存成InstallCert.java
  2. 切換到存放InstallCert.java的路徑,使用javac編譯成.class
  3. cmd:java InstallCert [your target SSL domain]
    執行第一次的時候會有錯誤。再執行一次就可以(總共執行兩次)
  4. 將產生出來的jssecacerts檔案複製到 $JAVA_HOME/jre/lib/secirity
  5. restart your service(ex:tomcat)

2015年4月2日 星期四

再一次Mybatis出現 java.io.IOException: Could not find resource...使用Gradle

參考:
MyBatis loading XML : java.io.IOException: Could not find resource


又再一次出現了惱人的錯誤:
 java.io.IOException: Could not find resource...


這次的情況很詭異,使用eclipse  build的時候一切成功,但是一使用gradle build就出錯了,跟以前不同的是這次build tool改使用了gradle(之前使用ANT或根本沒用)

找到了以上的參考文章,以下的回答:


Note Since you have placed batisConfig.xml under src/main/java. By default maven configures to include only */*.java file( only java files) if need to include all the files you need to configure accordingly. But I would recommend to move the xml file to src/main/resources directory( which is again a classpath)

雖然我並非使用maven,但是其實是一樣的問題,原來預設於src/main/java下都只有include *.java,因此我只要將我的 mapper.xml 移動到 src/main/resources 就可以囉!

2015年3月1日 星期日

使用Android Sudio出現Empty region錯誤

今天第一次嘗試使用Android Studio, 沒多久就出現了詭異的錯誤:
 Empty region 

查了半天才知道原來是AndroidManifest.xml中的
   android:icon=@drawable/xxx 
其中的Resource xxx若是對應的為.ico則會出現此錯誤。 

但是很奇怪的是,雖然出現這錯誤,卻能正確的delpoy到手機上耶! !


p.s:好久沒發文...

2014年12月9日 星期二

mybatis - 如何設定dynamic sql動態因應不同的database環境?

參考:Mybatis databaseIdProvider  Multi-db vendor support
  1. 首先於mybatis-config新增<databaseIdProvider>設定
  2. 
     
      
     
         
     
      
     
    
    
      
      
      
      
    
    
     
      
     
     
    
    
    
  3. 接者在欲使用的dynamic sql部分如下使用:
  4. 
    
    
      
        
          select seq_users.nextval from dual
        
        
          select nextval for seq_users from sysibm.sysdummy1"
        
      
      insert into users values (#{id}, #{name})
    
    
    

2014年11月15日 星期六

AngularJS Scope:use ng-include

此篇文章因為一開始使用mac pages製作,後來再轉成html輸出至此,格式很亂(因為我還不太會用pages),因此code的部分皆使用純文字貼上,請見諒

Scope:use ng-include
此篇所有測試sourceuse hg-include

angularJsScope繼承概念在一般情形下是很直觀的,然而在2-way-data binding的primitive情況下有些必須注意,以下來做些ng-include的小測試:

首先我們準備檔案index.html 
<!DOCTYPE html>
<html ng-app="myApp">
<!-- class="show-scope-demo"-->
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
  <link rel="stylesheet" href="style.css">
  <script src="script.js"></script>
</head>


<body ng-controller="scopeCtrl as ctrl">
  <h1>Hello!Scope</h1>

  use myPrimitive: <input ng-model="myPrimitive">
  use myObject.aNumber: <input ng-model="myObject.aNumber">

  <p>myPrimitive:{{myPrimitive}}</p>
  <p>myObject.aNumber:{{myObject.aNumber}}</p>

</body>


再來準備script.js 

var app = angular.module('myApp',[]);
app.controller('scopeCtrl' ,['$scope', function($scope){
  $scope.myPrimitive = 50;
  $scope.myObject    = {aNumber: 11};
  
  
  $scope.setMyPrimitive = function(value) {
      $scope.myPrimitive = value;
  }

}]);
執行測試:

  1. 當一開始載入後,一切如我們所想,兩個input輸入框與下方顯示都很完美的反應我們設定的初始值:
  2. 接下來我們試驗者改變兩個輸入框,將它們各自改變為2266,一切如我們預期般執行 

此時內部的假想scope如下:
 




接下來我們試驗使用ng-include方式,首先新增tpl1.html 

myPrimitive:
<input ng-model="myPrimitive">

<br>

再新增tpl2.html 


myObject.aNumber:<input ng-model="myObject.aNumber">

變更原先index.htmlbody部分): 


<body ng-controller="scopeCtrl as ctrl">
  <h1>Use ng-include</h1>

  <div ng-include src="'tpl1.html'"></div>
  <div ng-include src="'tpl2.html'"></div>

  <p>myPrimitive:{{myPrimitive}}</p>
  <p>myObject.aNumber:{{myObject.aNumber}}</p>

</body>

準備完畢,再一次執行測試:

  1. 當一開始載入後,一切如我們所想,兩個input輸入框與下方顯示都很完美的反應我們設定的初始值:
  2. 然而,這次我們一樣改變兩個輸入框,將它們各自改變為2266,卻發生了如下的情況
     

第一個myPrimitive沒有如果們預想的變更成功,這是怎麼一回事?
首先,我們知道使用ng-include會增加新的scope,因此一開始(初始載入後)的內部結構如下:



此時除了原先的RootScopeParentScope以外,又多了兩個ChildScope,分別為ng-include=‘tpl1.html’ng-include=‘tpl12.html’所產生。

而當我們變更輸入框的數值的時候,輸入框2(myObject.aNumber)還是維持與之前一樣的方式,參考至$parent.myObject.aNumber並且更改了他;然而輸入框1(myPrimitive)就不是這麼一回事了,他首先確認所屬的ChildScope1是否擁有myPrimitive這個變數,發現沒有,此時並不會如我們預想般自動去尋找$parent.myPrimitive,而是直接在ChildScope1下建立了myPrimitive,並且assign新值:22,因此目前內部結構變更如下: 

以上的問題全部都不是AngularJS才有的,屬於AngularJS的只有使用ng-include,建立了新scope;而不如我們預想般尋找$parent.myPrimitive並且變更而是產生新的myPrimitive則是JavascriptPrototypal Inheritance的概念(請參考連結文章,有很詳盡的說明)。

那麼如何去變更$parent.myPrimitive呢?有以下兩種方式:
  1. 一定使用關鍵字$parent
  2. 使用function()
以下我們繼續變更code測試上面兩個方式,首先測試第一種方式:使用$parent

變更tpl1.html

myPrimitive:
<input ng-model=“$parent.myPrimitive">

<br>

測試,變更輸入框為2266

執行成功!接下來測試第二種方式:使用function()
變更tp1.html


myPrimitive:
<input ng-model="myPrimitive">
<button ng-click="setMyPrimitive(myPrimitive)">$scope.setMyPrimitive()</button>

<br>

變更script.js


var app = angular.module('myApp',[]);
app.controller('scopeCtrl' ,['$scope', function($scope){
  $scope.myPrimitive = 50;
  $scope.myObject    = {aNumber: 11};
  
  $scope.setMyPrimitive = function(value) {
      $scope.myPrimitive = value;

  }

注意在這邊tpl1.html中的<input ng-model=“myPrimitive”>不是使用$parent.myPrimitive
開始測試!首先變更為2266



因為沒有使用方法1$parent.myPrimitive 因此myPrimitive如上所說一樣維持50 
這時我們按下<button>,呼叫$scope.setMyPrimitive(),確實變更成我們要的22了! 


2014年10月21日 星期二

JAVA - 基本properties的運用


說起來真是慚愧,用java這麼久,一直都沒有真正使用過properties file,今天就來練習一下:(其實是因為專案需要多國語系的關係啦,不得不用...)


假設我們設計一個網站 or app 需要支援多國語系,但不可能有人願意把每個跟語系有關的文字harcode在程式裡,畢竟那太愚蠢了,變成一個專案多個版本,卻只是為了那些不同的顯示文字,使用properties可以很好地解決這個問題:

今天我需要依照不同的語系,輸出不同的招呼語(中文=你好,英文=hello,日文=こんにちは),我該怎麼做呢:

首先是專案架構:
很簡單src只有一個檔案,而resource下的3個properties就是今天的主角囉,properties.sh只是方便執行測試的sh檔案,先看唯一的code Main.java:

package com.example.shihanne.properties;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class Main {

 public static void main(String[] args) throws IOException {
  Locale locale = Locale.getDefault();
  String key    = "hello";
  if(args.length == 1)
   key = args[0];
  if(args.length == 2){
   key = args[0];
   locale = Locale.forLanguageTag(args[1]);
  }
  System.out.println(new Main().getMessageByBundle(key,locale));
 }
    
    public String getMessageByBundle(String key,Locale local) throws UnsupportedEncodingException{
     ResourceBundle rs = ResourceBundle.getBundle("config",local); 
     return new String(rs.getString(key).getBytes("ISO-8859-1"),"UTF-8");
    }
}


以下是我的properties file:

config_en.properties:
hello=hello

config_zh_TW.properties:
hello=你好

config_ja.properties:
hello=こんにちは

很簡單,都各只有一行,=左邊的hello代表這個propertie的參數名稱(key),=右邊的也就是我們要輸出的各國語系value啦~

必須要注意的是properties的命名規則:[filename]_[locale].properties
在這裡我們使用的檔案名稱為config,繁體中文的locale=zh_TW,日文locale=ja,英文=en

程式很簡單,Main先偵測是否有指定參數:
第一個參數為欲讀取的properties key(此例為hello),第二個參數為語系(若沒有,則使用本機的預設語系(當然是zh_TW囉) )
之後我們再使用ResourceBundle.getBundle(basename,locale) 讀取properties file,最後再使用ResourceBundle.getString(key)讀出我們需要的value

properties.sh如下:

java -cp ../bin:../resource com.example.shihanne.properties.Main $1 $2

結果畫面:

2014年10月20日 星期一

Android GCM 某些裝置無法成功接收訊息

參考:
http://developer.android.com/google/gcm/client.html#manifest
http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/


將近一年沒有再碰過android,這兩天為了火燒屁股的專案不得已再撿回來碰,
這次測試的是使用Android GCM機制來發送Notification,但奇怪的是五台測試裝置,分別為Android:4.1.1,4.1.2,4.2.2,4.0.4,與2.3.3

但是,怎麼發送訊息,4.0.4與2.3.3的就是無法成功接收訊息,試驗了老半天,最後在上述參考網站2發現問題點,原來是AndroidManifest.xml設定的問題,我原先設定如下:



    
    
    
    
    

    
    

    
        
            
                
                
            
        
        
    



原因就出在其中的




因為我是直接偷懶貼google教學(如上參考網址1),結果沒有把其中的com.example.gcm替換為我的pkg:com.xxx
因此,只要將這兩行的pkg也替換掉為我的pkg,就可以順利運作了。

不過這種錯誤實在是太難找了..因為4.1.1,4.1.2,4.2.2的都運作正常啊...難道是因為版本比較高所以自動錯誤修正嗎....?

2014年9月17日 星期三

eclipse - java.lang.NoSuchMethodError: org.hsqldb.DatabaseURL.parseURL(Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties;

前些時候重灌了電腦,當然重灌後某些安裝路徑都會改變,這時候原本使用hsqldb做UnitTest的專案出現了以下錯誤: java.lang.NoSuchMethodError: org.hsqldb.DatabaseURL.parseURL(Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties; at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source) at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source) at java.sql.DriverManager.getConnection(DriverManager.java:571 ... 找了很久才發現,原來是我這個Test Proj有reference到主要被測試的Proj, 但是這個主要被測試的Proj某些設定在Eclipse的classpath卻因為電腦重灌的關係而失效了, 所以才會造成這個錯誤。 p.s使用者種與環境相關的設定還是簡單點好,儘量不要用絕對路徑設定的classpath 啊

2014年9月10日 星期三

ANT - build時出現 [javac] Compliance level '1.4' is incompatible with target level '1.8'. A compliance level '1.8' or better is required

參考:
http://stackoverflow.com/questions/1487978/setting-the-target-version-of-java-in-ant-javac

今天使用ant的時候出現了奇怪的錯誤:
  [javac] Compliance level '1.4' is incompatible with target level '1.8'. A compliance level '1.8' or better is required

我明明在javac中標明了target="1.8"如下:



  ...

後來找到上述討論區才知道原來可以加入以下這樣的property來解決這樣的問題:



2014年8月28日 星期四

使用 < jsp:include page="${pageContext.request.contextPath} />出現錯誤...javax.servlet.ServletException: JBWEB004036

使用類似以下的jsp:include方式:

< jsp:include
page="${pageContext.request.contextPath}/query/QueryUtil.jsp"/>
卻出現以下錯誤:

javax.servlet.ServletException: JBWEB004036: File &quot;/mx/query/QueryUtil.jsp&quot; not found
答案就是,jsp:include似乎不支援使用${pageContext.request.contextPath}

2014年8月9日 星期六

SVN - 如何修改已經commit的comment訊息?

參考:How do I edit a log message that I already committed in Subversion?
(編號38)


直接列出如下步驟:

  1. 首先進入該repository的hooks目錄
  2. mv pre-revprop-change.tmpl pre-revprop-change
  3. chmod 755 pre-revprop-change

2014年7月5日 星期六

Jenkins - svn commit時總是無法取到最新版本..

參考:Triggering build twice for each commit


    這問題困擾我蠻久的,就是每一次當我svn commit後呼叫post-commit 執行jenkins build的時候,『第一次』也就是由post-commit執行的那次jenkins build,總是無法取到最新的svn更新版本,一定要手動執行jenkins build才可以成功抓到svn最新版本。

    專案小的時候還無所謂,但隨者專案越來越大,且每一次build都還要執行unitTest的情況來說,每次的小修改,都要花上3~5分鐘(執行兩次build)才能build到最新版本開始測試,實在是很累。

   後來找到上述討論,似乎與time sync有關(不太明白為什麼),我用了討論串中最簡單的方式,也就是在jenkins build的組態中將svn url後面加上@HEAD的參數,解決了此問題。

   另一點奇怪的是,我有兩個專案,在一開始都沒這種問題,都是用到後面才開始出現.....

2014年6月18日 星期三

How do i show the leading zeros when exporting to excel..


參考:
http://www.raymondcamden.com/index.cfm?mode=entry&entry=432F11FE-06A0-BB83-6873F3EAD82A138F


因為案子有需要把網頁上的內容export成xls,但發生了個問題,我的資料有很多是"0"開頭的,例如:

0101000123


顯示的時候正常,但export xls後內容就變為:
101000123

很顯然的,excel將它當成了數字資料,因此截去了最左邊的0,
該怎麼解決呢??

看到網路上不少建議都是:自行打開excel然後更改整個col的資料形態,改為文字,
但這不符合我的需求(應該說客戶也不可能同意啊)。

最簡單的方式就是,在這樣的資料前面加上空白字元( &nbsp;)符號,就可以了。

2014年6月8日 星期日

ant - 如何在製作jar file時將一系列的*.jar 置入manifest classpath中?

參考:how-convert-list-jar-files-ant-classpath-build-jar

標題實在很不好下..總之就是,假設我有一堆的jar file置放於 lib 這個目錄下,今天我想打包一個jar檔案,class-path需要參考到這個lib目錄下的所有jar,但我又不希望一個一個手動輸入jar 名稱,該怎麼做?


原先一個一個輸入,build.xml可能如下:
 
  
  
     
       
           
   
       
       
   
  
    


若lib下的jar檔案數量很少,這樣做還沒什麼問題,但是當我今天lib下的jar檔假設有10多個以上,且常常要新增,那麼一直來維護這個build.xml就是很浪費時間的事情。

所以,參考上述網址,更改如下:
 
 
  
    
      
    
       
  
      
      
    
  
     
       
           
   
       
       
   
  
    


如果不放心,當執行完畢ant build後,可以解壓縮jar檔看manifest.mf正不正常:

2014年5月30日 星期五

Selenium - 如何移動『滑鼠』至隱藏的元件


今天偷到一點時間,繼續來研究selenium(再不研究會不敢改client了@@)。

遇到一個問題,例如這種常見的隱藏選單列:(圖片打馬賽克請見諒)

 MenuA,MenuB,MenuC是母選單,實際功能的子選單需將滑鼠移到各個母選單上才會在下方出現子選單:


今天我需要selenium模擬滑鼠移到其中的母選單『MenuB』,該怎麼做呢?
請參考如下片段:

        
 WebDriver _driver;
 //....
 WebElement element1 = _driver.findElement(By.xpath("//span[@id='MenuB']"));
 builder.moveToElement(element1).perform(); 

如上述,只要找到MenuB 母選單的element後,執行moveToElement()就可以了。

Cucumber - 使用時無法執行@Before 與 @After



最近開始嘗試使用cucumber + selenium,但測試的時候發現無法順利執行被
@Before或@After annotation標注的function,

原來當我們使用cucumber時,這些annotation的import位置為:

import cucumber.api.java.After;

import cucumber.api.java.Before;

而非JUNIT的
org.junit.After
org.junit.Before


雖然是小問題但沒想到還真要花些時間找呢~

2014年5月6日 星期二

JBOSS - web.xml中讀取環境變數

參考:JBOSS顧問

 如果我想要在web.xml設定環境變數可讀取,該怎麼做呢?參考以下的web.xml
  < web-app>
   
       
            log4jConfigLocation
            ${jboss.home.dir}/ap-config/xxxx/log4j.properties
      
   
  </ web-app>
如上述,我們希望在web.xml中指定log4j.properties的外部路徑,但需要使用環境變數讀取(避免不同客戶端機器安裝位置不同產生問題),
但在預設的JBOSS安裝是無法直接讀取的,修改方式很簡單,這裡以使用standalone的方式說明(若是使用domain就依照方式更改domain.xml就可)

找到${JBOSS_HOME}/standalone/configuration/standalone.xml,並找到以下片段(//profile/spec-descriptor-property-replacement):

        
            false
            true
        

重點就是spec-descriptor-property-replacement這個了,改成true,應該就可以順利運作了~

p.s跟有雄厚資金的客戶配合還是有好處的,因為他們有錢請顧問@@

2014年5月5日 星期一

Mybatis - if test dynamic sql出現 org.apache.ibatis.exceptions.PersistenceException : ###Error querying database. Cause: java.lang.NumberFormatException: For input string: "

參考:test expression throws NumberFormatException

今天使用mybatis if test出現個問題,原先使用如下:

 < select id="selectTable" parametertype="hashmap" resulttype="hashmap">
  select * from TABLE 
  
    
    < where>
      < if test="type == 'M' or type=='C' "> 
    
    ColA=#{volue} 
    < / if>
    < / where>  
        
  
 </ select> 

但卻出現了:

com.XXXX.util.exception.MIException: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.NumberFormatException: For input string: "M"

### Cause: java.lang.NumberFormatException: For input string: "M"

這就奇怪了,明明欲檢測的M與C應該是string怎會被轉換為number做檢查呢?
原來是"(雙引號)與'(單引號)解析的問題,改成如下:
 
< select id="selectTable" parametertype="hashmap" resulttype="hashmap">
  select * from TABLE 
  
  < where>
    < if test='type == "M" or type=="C" '> 
    
    ColA=#{volue} 
    < / if>
    < / where>        
  
</ select>
      

正常運作~ p.s話說就算使用了plugin貼xml語法還是會不正常啊...所以空格這種就自行刪除吧

2014年5月4日 星期日

JBOSS - 使用log4j失敗問題..

參考:Use my log4j under jboss 6

自從昨天移到JBOSS上後又發生怪問題...就是log問題。

因為客戶需求有各種不同的log,因此我利用點空閑時間將原本的log拆出區分為多個logger,
但怪問題發生了:

logger會時好時壞!!??

以下為我的log4j.properties:


log4j.rootLogger=DEBUG,total

log4j.appender.total=org.apache.log4j.FileAppender
log4j.logger.com.xxxx.mi.web.servlet.query=DEBUG,AOPLOG
log4j.logger.com.xxxx.mi.web.esb.util=DEBUG,AESBLOG
log4j.logger.com.xxxx.mi.web.omicard=DEBUG,AOMICARDLOG
log4j.logger.com.xxxx.mi.web.sql.mybatis=TRACE,ADBLOG


所謂的時好時壞就是,rootLogger一定是正常的,然而我其他定義的logger(如上com.xxxx.mi.web.servlet,logger.com.xxxx.mi.web.esb.util..這些),有時正常有時卻無法正確記錄,而且每次重啟jboss後正常或不正常的logger都不一定,
一開始以為是我的log4j.properties有問題,然而嘗試了半天實在找不到錯誤...後來看到以上參考網站,試者在tomcat上使用...果然tomcat一切正常,就只有jboss不正常。

後來找了些文章,好像jboss本身有自帶log,因此會衝突(?),先依照參考網站解決方式如下:


  1. 在META-INF下新增jboss-deployment-structure.xml,內容如下:

  2. 
      
        
            
            
        
      
    
    
  3. 更改JBOSS的設定:更改${JBOSS_HOME}/bin/standalone.bat(這裡使用win) 新增啟動參數-Dorg.jboss.as.logging.per-deployment=false:
    先找到以下這段:
    rem Setup JBoss specific properties 
    set "JAVA_OPTS=-Dprogram.name=%PROGNAME% %JAVA_OPTS% "
    


    更改為:
    rem Setup JBoss specific properties 
    set "JAVA_OPTS=-Dprogram.name=%PROGNAME% %JAVA_OPTS% -Dorg.jboss.as.logging.per-deployment=false"
    
  4. 重新啟動jboss,如果先前log4j的其餘部分沒有問題,應該就可以正常運作囉~~
這問題搞了我一天多....進度又整個延宕.............!@&^^$!@$@#

2014年5月3日 星期六

ESAPI - java.lang.reflect.InvocationTargetException....java.lang.ClassCastException: org.owasp.esapi.reference.Log4JLogger ...

參考: How to resolve the error "java.lang.reflect.InvocationTargetException"

今天ESAPI又出現了這個似曾相似(前篇)的錯誤:

org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException HTTPUtilities class (org.owasp.esapi.reference.DefaultHTTPUtilities) CTOR threw exception.
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129)
at org.owasp.esapi.ESAPI.httpUtilities(ESAPI.java:121)
at..
.....
Caused by: java.lang.ClassCastException: org.owasp.esapi.reference.Log4JLogger cannot be cast to org.owasp.esapi.Logger
at org.owasp.esapi.reference.Log4JLogFactory.getLogger(Log4JLogFactory.java:88)
at org.owasp.esapi.ESAPI.getLogger(ESAPI.java:154)
at org.owasp.esapi.reference.DefaultHTTPUtilities.<init>(DefaultHTTPUtilities.java:112)
at org.owasp.esapi.reference.DefaultHTTPUtilities.getInstance(DefaultHTTPUtilities.java:68)
... 40 more

不同的是,此次root exception為:
java.lang.ClassCastException: org.owasp.esapi.reference.Log4JLogger

這...真是太匪夷所思了,這段code我可是改都沒改,且出錯的為esapi內部,而且TestCode又都運作正常全綠燈(確定有測試到這段!!),卻在實際環境上報錯,所以應該可以『很合理』的猜出是與『環境』有關造成的錯誤而非code(TestCode告訴我一定不是我code寫錯~~
),最後找到以上參考網站,看到此段:

By chance, do you happen to have an instance of Apache Tomcat already running, or do you also have Microsoft Outlook running while you are trying to startup Tomcat? If so, shut down Outlook, start Tomcat, then restart Outlook. I've had problems in the past with conflicts like this.

的確,因為我今天才把war從tomcat搬到jboss上,而原先的tomcat還在運作中(同一台機器),因此只要把tomcat給關了,移除掉原先deploy的webapp,再重啟jboss就可以順利運作了~~

p.s:話說這個標籤該分類到哪呢?好像分類在esapi也不太對....?