当我从CXF使用wsdl2java生成Web服务客户端(生成类似于wsimport的东西)时,通过maven,我的服务从以下代码开始:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
硬编码的绝对路径确实很烂。生成的类无法在我的其他计算机上使用。
第一个想法是将WSDL文件(加上它导入的所有内容,其他WSDL和XSD)放在jar文件中,并对其进行类路径。但是我们要避免这种情况。由于所有这些都是由CXF和JAXB基于WSDL和XSD生成的,因此我们不需要在运行时知道WSDL。
wsdlLocation属性用于覆盖WSDL位置(至少这是我在某处读取的内容),并且其默认值为“”。由于我们正在使用Maven,因此我们尝试包含<wsdlLocation></wsdlLocation>
在CXF的配置中,以尝试强制源生成器将wsdlLocation留为空白。但是,这只是使其忽略XML标记,因为它是空的。我们使用做了一个非常丑陋的可耻的骇客<wsdlLocation>" + "</wsdlLocation>
。
这也改变了其他地方:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
因此,我的问题是:
即使所有类都是由CXF和JAXB生成的,我们是否真的需要WSDL位置?如果是,为什么?
如果我们真的不需要WSDL位置,那么什么是使CXF不生成并完全避免它的正确而干净的方法?
使用该hack会带来哪些不良影响?我们仍然无法测试是否会发生这种情况,因此,如果有人可以提前说,那就太好了。
classpath:
在该<wsdlLocation...
行中省略。