我正在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,该WSDL具有附加的安全信息。然而,似乎没有什么能改变wsimport生成的文件的组成。
因此,我想我的问题是,为了获得一个符合WSIT的客户端,我是否完全放弃了Maven和jaxws插件?有办法让WSIT客户端自动生成吗?还是需要手工生成客户端?
如果你需要我写的以外的其他信息,请告诉我。我正在部署到Tomcat,尽管这似乎不是一个问题,因为Maven似乎很乐意将Metro拖到已部署的WAR文件中。
提前感谢!
编辑:在和WSIT玩了很多次之后,以下是对我有用的东西。
首先,使用Netbeans生成WSIT客户端。测试它以确保其工作,然后将WSIT配置文件(wsit-client.xml和web服务name.xml)移动到WS客户端项目的META目录中。
从安全性的角度来看,项目的相关附加部分是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>显然,这里有一些硬编码的依赖项,我们需要在构建过程中加以管理。用户、密码、信任库的位置和同级都是开发的缺省值,并将随着系统从dev迁移到测试和生产而发生变化。我们正在尝试一些不同的管理策略,但是我们可能最终会在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依赖项。
发布于 2010-03-24 17:55:57
您不是应该只为客户端提供客户端的WSIT配置文件吗?你对wsimport的期望到底是什么?
编辑:作为暗示,WSIT文档描述两个客户端配置文件:wsit-client.xml和{wsdl file name}.xml和:
当运行客户机时,这些文件需要在类路径中,或者在类路径根(即构建/类)中,或者在类路径根下的META目录中。
转移到Maven项目中,这些文件的自然位置将是src/main/resources或src/main/resources/META-INF文件夹。就我个人而言,我倾向于把他们放在元INF中。
https://stackoverflow.com/questions/2508281
复制相似问题