我正在 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 依赖项。