記一次WebService調用踩的坑

問題描述:由於公司最近引進了某公司A的網絡管理軟件,需要使用A提供的WebService接口。

遇到問題如下:

1、接口文檔不規範。WebSerivce 接口有安全性校驗要求,需要在 SOAP 頭部增加相應的用戶名和密碼作爲安全配置。
2、依賴衝突、Bug等

解決方法:

1、、拿到接口肯定是先測試,看能不能通,我也是這麼幹的,然,以前沒使用過WebService (工作一年見的少)都是使用Rest風格的接口。一上來我就拿出了我的PostMan 。。。。怎麼填都搞不定。。SOAP頭搞得我焦頭爛額,在網上查也沒找到用PostMan測安全性校驗WebSerivce 接口的例子。沒轍,聯繫A公司售後,告訴我用soap UI ,然後幫我測了一個接口如圖在這裏插入圖片描述
總結:度娘不行的時候找客服。。。

2、實際在項目中遇到的問題描述如下:寫完代碼,調試完畢沒有Bug的情況下,我把它打成了jar包,使用 java -jar xx.jar 執行的時候出現如下問題:
在這裏插入圖片描述
java.lang.NullPointerException
at org.apache.cxf.common.util.Compiler.useJava6Compiler(Compiler.java:190)

原因如下:
經查看源碼發現有這樣一句:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

ToolProvider.getSystemJavaCompiler()返回的是NULL,因此在調用compiler.getStandardFileManager(null, null, null)的時候拋出了null pointer exception.

爲啥會這樣呢?查看了下ToolProvider的源代碼,發現如下這麼一段…

private static final String[] defaultToolsLocation   = { "lib", "tools.jar" }; 
private static Class<?> findClass()  throws MalformedURLException, ClassNotFoundException{
             try {
                 return enableAsserts(Class.forName(defaultJavaCompilerName, false, null));
             } catch (ClassNotFoundException e) {
                 // ignored, try looking else where
             }
             File file = new File(System.getProperty("java.home"));
             if (file.getName().equalsIgnoreCase("jre"))
                 file = file.getParentFile();
             for (String name : defaultToolsLocation)
                 file = new File(file, name);
             URL[] urls = {file.toURI().toURL()};
             ClassLoader cl = URLClassLoader.newInstance(urls);
             cl.setPackageAssertionStatus("com.sun.tools.javac", true);
             return Class.forName(defaultJavaCompilerName, false, cl);
         }

我已經設置了JAVA_HOME環境變量,指向了我的JRE安裝目錄D:\Java\jre6, 注意查找文件的代碼…

for (String name : defaultToolsLocation)
                file = new File(file, name);

也就是說會查找目錄D:\Java\jre6\lib\tools.jar

但是注意的是tools.jar並不在jre中,而是在jdk安裝目錄下,因此我手動把這個jar文件從jdk目錄下拷貝到了jre目錄下,再次運行上面的代碼就沒有問題了!同時注意到在代碼工程目錄下生成了一個名爲Main.class的文件,這個確實說明了動態類Main已經編譯成功了!

總結:
參考自:http://www.cnblogs.com/fangwenyu/archive/2011/10/12/2209051.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章