代码之家  ›  专栏  ›  技术社区  ›  rtperson

wsit、maven和wsimport—它们能一起工作吗?

  •  6
  • rtperson  · 技术社区  · 14 年前

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   Pascal Thivent    14 年前

    你不是应该这样做吗? 提供 客户机端的wsit配置文件?你期待什么 wsimport 确切地?

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

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

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