首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免在CXF或JAX-WS生成的webservice客户端中指定WSDL位置?

如何避免在CXF或JAX-WS生成的webservice客户端中指定WSDL位置?
EN

Stack Overflow用户
提问于 2010-12-16 05:38:50
回答 10查看 177.6K关注 0票数 178

当我通过maven从CXF使用wsdl2java (它生成类似于wsimport的东西)生成webservice客户端时,我的服务以如下代码开始:

代码语言:javascript
复制
@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>

这也改变了其他地方:

代码语言:javascript
复制
@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;
    }

所以,我的问题是:

即使所有的类都是由和

  1. 生成的,我们真的需要一个WSDL位置吗?如果是,为什么?
  2. 如果我们真的不需要WSDL位置,什么是正确和干净的方法,使CXF不生成它,并完全避免它?
  3. ,我们会得到什么坏的副作用?我们还不能进行测试,看看会发生什么,所以如果有人能提前说出来,那就太好了。
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-03-27 00:10:28

今天我终于找到了这个问题的正确答案。

代码语言:javascript
复制
<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将位于类路径上,而不是绝对路径上。然后,它将生成类似如下的代码:

代码语言:javascript
复制
@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。

票数 221
EN

Stack Overflow用户

发布于 2011-01-14 00:05:49

我们使用

代码语言:javascript
复制
wsdlLocation = "WEB-INF/wsdl/WSDL.wsdl"

换句话说,使用相对于类路径的路径。

我认为在编组/解组期间,可能需要在运行时使用WSDL来验证消息。

票数 22
EN

Stack Overflow用户

发布于 2015-09-10 19:14:14

对于那些在构建时使用org.jvnet.jax-ws-commons:jaxws-maven-plugin从WSDL生成客户端的用户:

  • 将WSDL放在src/main/resources
  • Do中的某个位置,而不是使用classpath:
  • Do作为的前缀作为wsdlLocation的前缀,使用classpath:
  • Do作为wsdlLocation的前缀

示例:

使用/src/main/resources/foo/bar.wsdl

  • Configure和<wsdlLocation>/foo/bar.wsdl</wsdlLocation>

  • WSDL存储在<wsdlDirectory>${basedir}/src/main/resources/foo</wsdlDirectory> jaxws-maven-plugin
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4455195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档