当我通过 maven 使用 CXF 中的 wsdl2java 生成一个 webservice 客户端时(它会生成类似于 wsimport 的代码) ,我的服务以下面这样的代码开始:
@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 文件和类路径中的某个地方。但我们不想这样。由于所有这些都是由基于 WSDL 和 XSD 的 CXF 和 JAXB 生成的,因此我们认为在运行时没有必要了解 WSDL。
WsdlLocation 属性旨在覆盖 WSDL 位置(至少这是我在某处读到的) ,它的默认值是“”。由于我们使用的是 maven,因此我们尝试在 CXF 的配置中包含 <wsdlLocation></wsdlLocation>
,以强制源生成器将 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 不生成并完全避免它的正确和干净的方法呢?
黑进去会有什么副作用?我们仍然不能测试,看看会发生什么,所以如果有人能提前说,这将是很好的。