問題描述:由於公司最近引進了某公司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