当我通过maven从CXF使用wsdl2java (它生成类似于wsimport的东西)生成webservice客户端时,我的服务以如下代码开始:
@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;
}
所以,我的问题是:
即使所有的类都是由和
发布于 2012-03-27 00:10:28
今天我终于找到了这个问题的正确答案。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.basedir}/src/main/resources/wsdl/FooService.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/FooService.wsdl</wsdlLocation>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
请注意,我在wsdlLocation
中的值前面加上了classpath:
。这告诉插件wsdl将位于类路径上,而不是绝对路径上。然后,它将生成类似如下的代码:
@WebServiceClient(name = "FooService",
wsdlLocation = "classpath:wsdl/FooService.wsdl",
targetNamespace = "http://org/example/foo")
public class Foo_Service extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://org/example/foo", "Foo");
public final static QName FooSOAPOverHTTP = new QName("http://org/example/foo", "Foo_SOAPOverHTTP");
static {
URL url = Foo_Service.class.getClassLoader().getResource("wsdl/FooService.wsdl");
if (url == null) {
java.util.logging.Logger.getLogger(Foo_Service.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "classpath:wsdl/FooService.wsdl");
}
WSDL_LOCATION = url;
}
请注意,这只适用于2.4.1或更高版本的cxf-codegen-plugin。
发布于 2011-01-14 00:05:49
我们使用
wsdlLocation = "WEB-INF/wsdl/WSDL.wsdl"
换句话说,使用相对于类路径的路径。
我认为在编组/解组期间,可能需要在运行时使用WSDL来验证消息。
发布于 2015-09-10 19:14:14
对于那些在构建时使用org.jvnet.jax-ws-commons:jaxws-maven-plugin
从WSDL生成客户端的用户:
src/main/resources
classpath:
wsdlLocation
的前缀,使用classpath:
wsdlLocation
的前缀示例:
使用/src/main/resources/foo/bar.wsdl
<wsdlLocation>/foo/bar.wsdl</wsdlLocation>
将
<wsdlDirectory>${basedir}/src/main/resources/foo</wsdlDirectory>
jaxws-maven-plugin
中https://stackoverflow.com/questions/4455195
复制相似问题