我正在Maven中进行一个小型的多模块项目。我们已经使用Web服务将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>
显然,这里有一些硬编码的依赖关系,我们需要在构建过程中进行管理。用户,密码,信任库的位置以及对等别名都是开发的默认值,并且随着系统从开发阶段进入测试阶段和生产阶段而改变。我们正在尝试几种不同的策略来管理此问题,但最终可能会在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依赖项。
最佳答案
您不是只应该为客户端提供客户端WSIT配置文件吗?您对wsimport
有什么期望?
编辑:如所暗示的那样,WSIT文档describes两个客户端配置文件:wsit-client.xml
和{wsdl file name}.xml
以及:
转置为Maven项目后,这些文件的自然位置将为src/main/resources
或src/main/resources/META-INF
文件夹。就个人而言,我倾向于将它们放在META-INF中。
关于web-services - WSIT,Maven和wsimport-他们可以一起工作吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2508281/