WSIT,Maven和wsimport - 他们可以一起工作吗?

时间:2010-03-24 14:10:14

标签: web-services maven-2 jax-ws maven-plugin wsit

我正在Maven开展一个小型的多模块项目。我们已经使用Web Services将UI与数据库层分离,并且由于jaxws-maven-plugin,我们或多或少地为我们处理了WSDL和WS客户端的创建。 (该插件本质上是围绕wsgen和wsimport的包装器。)到目前为止一直很好。

当我尝试将WSIT安全性分层到图片中时,问题出现了。 NetBeans允许我轻松生成安全元数据,但是wsimport似乎完全无法处理Basic-auth安全级别之外的任何事情。

这是我们在Maven构建过程中调用wsimport的当前不安全方式:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <wsdlUrls>
                    <wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
                </wsdlUrls>
                <packageName>com.yourcompany.appname.ws.client</packageName>
                <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                <destDir>${basedir}/target/jaxws</destDir>
            </configuration>
        </execution>
    </executions>
</plugin>

我尝试过使用xauthFile,xadditionalHeaders,通过args传递javax.xml.ws.security.auth.username和密码。我还尝试从命令行使用wsimport指向Tomcat生成的WSDL,它具有额外的安全信息。但是,似乎没有任何东西可以改变wsimport生成的文件的组成。

所以我想我的问题是,为了获得一个符合WSIT标准的客户端,我是不是放弃了Maven和jaxws插件?有没有办法让WSIT客户端自动生成?或者我需要手动生成客户端吗?

如果您需要我在此处撰写的任何其他信息,请告知我们。我正在部署到Tomcat,虽然这似乎不是问题,因为Maven似乎很乐意将Metro拉入部署的WAR文件中。

提前致谢!

编辑:经过大量的WSIT游戏后,这对我有用。

对于初学者,使用Netbeans生成WSIT客户端。测试它以确保它正常工作,然后将WSIT配置文件(wsit-client.xml和[您的Web服务名称] .xml)移动到WS客户端项目的META-INF目录。

从安全角度来看,对项目的相关添加是Web服务xml中的标记:

<wsp:Policy wsu:Id="WebPortBindingPolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sc:CallbackHandlerConfiguration wspp:visibility="private">
                <sc:CallbackHandler default="wsitUser" name="usernameHandler"/>
                <sc:CallbackHandler default="changeit" name="passwordHandler"/>
            </sc:CallbackHandlerConfiguration>
            <sc:TrustStore wspp:visibility="private" location="C:\Apps\apache-tomcat-6.0.24\certs\client-truststore.jks" type="JKS" storepass="changeit" peeralias="xws-security-server"/>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

显然,这里有一些硬编码的依赖项,我们需要在构建期间进行管理。用户,密码,信任库的位置和peeralias都是开发默认值,并且会随着系统从开发转移到测试和生产而改变。我们正在使用一些不同的策略来管理这个,但我们可能最终会在Hudson中设置环境变量以构建每个环境。

稍微调整一下Maven的jaxws插件的配置。我们生成WSDL作为构建的一部分,因此我们不需要在本地引用它。这是我们的WS客户端目标中的wsimport命令的插件标记:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>1.12</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <wsdlUrls>
                    <wsdlUrl>${basedir}/../WebService/target/jaxws/wsgen/wsdl/WebService.wsdl</wsdlUrl>
                </wsdlUrls>
                <staleFile>${project.build.directory}/jaxws/stale/WebService.stale</staleFile>
                <packageName>com.yourcompany.appname.ws.client</packageName>
                <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                <destDir>${basedir}/target/jaxws</destDir>
            </configuration>
            <id>wsimport-generate-WebService</id>
            <phase>generate-sources</phase>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>webservices-api</artifactId>
            <version>2.0-b30</version>
        </dependency>
    </dependencies>
    <configuration>
        <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
        <xnocompile>true</xnocompile>
        <verbose>true</verbose>
        <extension>true</extension>
    </configuration>
</plugin>

最后,当然,确保所有需要调用Web服务的项目都正确设置了Metro依赖项。

1 个答案:

答案 0 :(得分:2)

您是不是应该为客户端提供客户端WSIT配置文件?您对wsimport的期望是什么?

编辑:正如所暗示的那样,WSIT文档describes有两个客户端配置文件:wsit-client.xml{wsdl file name}.xml以及:

  

运行客户端时,这些文件需要位于类路径中,可以是类路径根(即构建/类),也可以是类路径根目录下的META-INF目录。

转置到Maven项目,这些文件的自然位置将是src/main/resourcessrc/main/resources/META-INF文件夹。就个人而言,我倾向于将它们放在META-INF中。