【问题标题】:WSIT, Maven, and wsimport -- Can They Work Together?WSIT、Maven 和 wsimport——它们可以一起工作吗?
【发布时间】:2010-03-24 14:10:14
【问题描述】:

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

当我尝试将 WSIT 安全性分层时,问题就出现了。 NetBeans 允许我轻松生成安全元数据,但 wsimport 似乎完全无法处理超出基本身份验证级别安全性的任何内容。

这是我们当前在 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 依赖项。

【问题讨论】:

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


    【解决方案1】:

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

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

    运行客户端时,这些文件需要在类路径中,或者在类路径根目录(即 build/classes)或在类路径根目录下的 META-INF 目录中。

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

    【讨论】:

    • 其中的“公正”部分就是诀窍。我今天在这方面做了很多工作,并且按照 WSIT 教程,我能够让 NetBeans 创建一个安全的 WS 客户端。我仍然无法让我的 Maven 项目愉快地使用配置,但我已经接近了。这是我的第一个安全 Web 服务,所以我边走边学。我可能会提交我自己的答案作为我如何做到的迷你教程,这样其他人就可以避免我所经历的一些痛苦。谢谢!
    • @rtperson 我并不是说 WSIT 微不足道,但我仍然不明白您在 wsimport 期间会发生什么。 AFAIK,提供客户端 WSIT 配置文件不会影响客户端工件的生成。
    • Pascal,现在我已经看到了这些部分是如何组合在一起的,我知道 wsimport 不会做任何与现在不同的事情,所以我已经设法超越了这一点。但是我还不能通过 Maven 创建一个安全的 WSIT 客户端。我现在在家,我面前没有代码,但客户端配置文件只是 META-INF 中的两个,对吗? wsit_client 配置和 Web 服务描述符? (这是我第一次实现 WSIT,如果你不知道的话。请原谅我的知识空白。)
    • @rtperson 我已经更新了我的答案以涵盖这一点。 TBH,我不能说我发现 WSIT 非常直观/友好,所以我当然不会怪你 :)
    • 确实如此。与旧 JWSDP 示例代码中的手动编码安全处理程序类相比,我更喜欢 WSIT,而且 JWS 和 .NET 之间的 QOS 保证很好。但老实说,如果 NetBeans 不允许自动生成配置,我不确定我如何能够弄清楚如何手动完成。
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2021-03-05
    • 2011-03-31
    • 2015-11-13
    相关资源
    最近更新 更多