前些日子用xfire1.2.6開發了一個webservice接口,主要功能是用來傳輸檔案,接口定義如下:
public interface WSExport {
public byte[] export(String docPath,String xmlPath) throws Exception;
}
開發好服務端和用戶端後,在tomcat6下面測試通過,以為一切ok了。但昨天做內建測試時,把用戶端釋出到weblogic9.1問題就來了。
問題一:
調用接口,報java.lang.NoSuchMethodError: javax.jws.WebService.portName()Ljava/lang/String 異常。
問題一原因:
經過在網上google+baidu,找到了問題所在,原因是weblogic裡面用到包%WL_HOME%\server\lib\weblogic.jar裡面有javax.jws.WebService這個類,版本跟xfire裡面用到的包xfire-jsr181-api-1.0-M1.jar裡面的類javax.jws.WebService版本不一緻,而運作時預設優先加載的是weblogic.jar裡面的類,是以引起沖突。
問題一解決方法:
把xfire的包xfire-jsr181-api-1.0-M1.jar複制到%WL_HOME%\server\lib\目錄下,并且修改配置檔案%WL_HOME%\common\bin\commEnv.cmd(linux下修改commEnv.sh)。
找到SET WEBLOGIC_CLASSPATH= 這行,把%WL_HOME%\server\lib\xfire-jsr181-api-1.0-M1.jar加在%WL_HOME%\server\lib\weblogic.jar前面,然後儲存。重新開機weblogic問題一解決。
問題二:
問題一解決後以為萬事大吉了,誰知調用接口時,新的問題來了。報:
java.lang.UnsupportedOperationException
at weblogic.xml.stax.XMLStreamReaderBase.getTextCharacters(XMLStreamRead
erBase.java:487)
問題二原因:
找了半天沒找到真正原因,隻知道大家都說接口傳回是byte[]就會出現以上異常。
問題二解決方法:
這是個不完美的解決方法,需要更改接口,把byte[]用base64進行編碼,編碼後byte[]變成了String,然後用戶端收到String後用base64解碼成byte[]。異常不再出現,成功将檔案通過webservice傳輸到用戶端。希望有高人提出更好的解決方法供大家讨論。
2 樓 大貓阿Ken 2009-10-29 最近實驗了一下新的解決方法,如下:
上面遇到的兩個問題其實都是包加載順序問題,解決方法不需要上面這麼複雜。隻需要在工程的/WEB-INF/weblogic.xml檔案中作修改,讓運作時先加載工程目錄下的包就可以了,weblogic.xml的内容如下:
Java代碼
- <?xml version="1.0" encoding="UTF-8"?>
- <wls:weblogic-web-app
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:wls="http://www.bea.com/ns/weblogic/90"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
- <wls:context-root>/</wls:context-root>
- <wls:container-descriptor>
- <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
- </wls:container-descriptor>
- </wls:weblogic-web-app>