keanu@wordpress.com

living today for tomorrow

Archive for the ‘Programming’ Category

[CXF] DynamicClient 的 ClassNotFoundException 問題解法

沒有留言

我真的覺得我在惡搞… = =

先來解說一下任務內容︰對方會提供 WSDL 位址,於是要刻一隻程式來解析 WSDL 的內容,抓取出其中 service 的 operation list 與所需要帶的參數,比較完整的做法會像是 WSDL2Java 來幫忙產生實際的 Java code,然後自己再手動剪剪貼貼程式碼以符合真實的狀況,最後用這段程式碼去呼叫 Service。不過這樣做實在是太苦了,Apache CXF 有提供一懶人包叫 Dynamic Client,只需要把 WSDL 內容餵進去,它便會在 runtime 的時候產生對應的程式碼出來,然後用 invoke() 把要執行的 operation 名稱與參數值帶進去就可以了,很 easy。

任務過程︰一開始我在 Local 測試 Dynamic Client 效果很好,完全符合我的需求,所以很高興地趕快把程式補到 Servlet 上,結果在 JaxWsDynamicClientFactory 要跑 newInstance() 時竟然掛點,吐出 ClassNotFoundException 的例外訊息給我,但明明 Libraries 裡可以看到 org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory 是存在的,只好 google 找看看有沒有解法。

最後找到有人遇到跟我一樣的問題 (是的,我跟他一樣都是 Beginner),於是跟著照做 ContextClassLoader 這段︰


ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
JaxWsDynamicClientFactory dcFactory =JaxWsDynamicClientFactory.newInstance();
this.dClient = dcFactory.createClient(this.wsdlStr, classLoader);

但還是無用,只好開始亂翻 Project Properties 看有什麼地方可以設定的,有翻還真的有保佑,在 Java EE Module Dependencies 的地方把 CXF Module 勾選起來,重新跑一次 Servlet,竟然成功了….

我只能說一切都是在亂搞的過程結束任務的。

作者為Keanu

一月 22, 2009 at 1:13 am

張貼於Programming

Struts2 的 XSLTResult 中文問題

with 2 comments

Struts2 在近期版有個滿吸引我的特色,便是在 View 層可以將 action object 藉由 Xalan 來轉成 XML 格式資料,並透過 XSLTResult 套上指定的 xsl 樣版輸出成網頁。

不過在測試的過程中發現,似乎目前的 2.0.x 版還無法支援 xsl:include 與 xsl:import 這類的語法,所以跑去 Struts 的 Issue Tracker 上面看看是不是有類似的 issue 有被提出來,於是看到了 [WW-2334][WW-2561]。看起來是要用 response 的 protocol 來指定到正確的 xsl 樣版路徑,這個功能在 2.1.x 版才有支援。

在換上了 2.1.x 版的 Struts2 後,的確是可以用 xsl:include 來引入其它的 xsl 樣版了,但看起來只要是非英語系的字元都會爛掉。根據過去的經驗,猜想應該是 XSLTResult 這個 class 內部在用PrintWriter 輸出時少做了編碼的動作,才使得中文會爛掉。

最直覺的解法就是 extends 原本的 XSLTResult class,然後再 overwrite 它的 execute() method,在建立 PrintWriter 的時候就先指定 UTF-8 的編碼︰


HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter writer = new PrintWriter(new java.io.OutputStreamWriter(response.getOutputStream(), "UTF-8"));

然後再 struts.xml 裡設定 result-types 是要用這個自訂的 XSLTResult class︰


<result-types>
<result-type name="xslt2" class="com.hyweb.searchg2.views.xslt.HyXSLTResult"/>
</result-types>

於是輸出的 HTML 網頁便可以順利顯示中文字元了。

作者為Keanu

八月 20, 2008 at 1:49 午後

張貼於Programming

善用 StringBuilder 的 buffer 改善程式效能

沒有留言

在 C# 中,我們多半會利用 StringBuilder 來處理大量且繁雜的文字串邏輯,因為 StringBuilder 裡內建的 buffer 實在是太好用了,若能在程式裡共享 buffer 裡儲存的資料,那 StringWriter 便是今天的主角。

Dot Net Perls: http://dotnetperls.com/Content/StringWriter-Buffer.aspx

繼續閱讀文章 »

作者為Keanu

七月 27, 2008 at 1:47 am

張貼於Programming

Re: Oracle CLOB Field 資料存取

沒有留言

前次的方法 太手工了,後來不小心在 Sun 的 API 文件看到有這個 getSubString(),於是便小修了一下程式碼,顯得更簡短︰


int len = (int) dataClob.length();
StringBuffer contentBuffer = new StringBuffer();
contentBuffer.append(dataClob.getSubString(1, len));

經驗還是不夠啊。

作者為Keanu

三月 26, 2008 at 1:22 午後

張貼於Programming, work

Oracle CLOB Field 資料存取

有一則留言

碰到一個問題是,資料會以 Character 的型態存入 Oracle 某張表的 CLOB 欄位,因為以前沒實際遇過處理這方面的問題,於是參考了 Oracle 網站所提供的 LOBSample 很快的便解決這個 issue。

繼續閱讀文章 »

作者為Keanu

三月 2, 2008 at 10:06 am

張貼於Programming, work