天天看點

java.lang.NoSuchMethodError: javax.jws.WebService.portName()Ljava/lang/String

前些日子用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代碼

java.lang.NoSuchMethodError: javax.jws.WebService.portName()Ljava/lang/String
java.lang.NoSuchMethodError: javax.jws.WebService.portName()Ljava/lang/String
java.lang.NoSuchMethodError: javax.jws.WebService.portName()Ljava/lang/String
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <wls:weblogic-web-app   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:wls="http://www.bea.com/ns/weblogic/90"  
  5.     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">   
  6.     <wls:context-root>/</wls:context-root>   
  7.     <wls:container-descriptor>   
  8.         <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>   
  9.     </wls:container-descriptor>   
  10. </wls:weblogic-web-app>