记一次WebService调用踩的坑

问题描述:由于公司最近引进了某公司A的网络管理软件,需要使用A提供的WebService接口。

遇到问题如下:

1、接口文档不规范。WebSerivce 接口有安全性校验要求,需要在 SOAP 头部增加相应的用户名和密码作为安全配置。
2、依赖冲突、Bug等

解决方法:

1、、拿到接口肯定是先测试,看能不能通,我也是这么干的,然,以前没使用过WebService (工作一年见的少)都是使用Rest风格的接口。一上来我就拿出了我的PostMan 。。。。怎么填都搞不定。。SOAP头搞得我焦头烂额,在网上查也没找到用PostMan测安全性校验WebSerivce 接口的例子。没辙,联系A公司售后,告诉我用soap UI ,然后帮我测了一个接口如图记一次WebService调用踩的坑_第1张图片
总结:度娘不行的时候找客服。。。

2、实际在项目中遇到的问题描述如下:写完代码,调试完毕没有Bug的情况下,我把它打成了jar包,使用 java -jar xx.jar 执行的时候出现如下问题:
记一次WebService调用踩的坑_第2张图片
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

你可能感兴趣的:(Java基础)