我在Maven从事一个小型的ISH多模块项目。我们已经使用Web服务将UI与数据库层分离开来,而且由于jaxws maven插件,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,该WSDL具有附加的安全信息。然而,似乎没有任何东西可以改变wsimport生成的文件的组成。
所以我想我的问题是,为了得到一个兼容wsit的客户机,我是否会一直放弃Maven和Jaxws插件?有没有办法让wsit客户机自动生成?或者我需要手工生成客户机?
如果您需要我在这里写的以外的任何其他信息,请告诉我。我正在部署Tomcat,尽管这似乎不是问题,因为Maven似乎很乐意将Metro纳入部署的战争文件中。
事先谢谢!
编辑:
在和WSIT打了很多交道之后,这就是我的工作。
对于初学者,使用netbeans生成一个wsit客户机。测试它以确保其正常工作,然后将ws it配置文件(wsit-client.xml和[your web service name].xml)移动到WS-client项目的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>
显然,这里有一些硬编码的依赖项,我们在构建期间需要管理它们。用户、密码、信任库的位置和对等别名都是开发默认值,并将随着系统从开发转向测试和生产而更改。我们正在尝试一些不同的策略来管理这一点,但我们最终可能会在哈德逊设置环境变量,以构建每个环境。
稍微修改一下Maven的jaxws插件的配置。我们生成WSDL作为构建的一部分,因此不需要在本地引用它。以下是我们的WS-Client目标中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依赖项。