配置Maven以使用CXF wsdl2java和基本身份验证

时间:2012-11-12 11:27:25

标签: maven cxf basic-authentication pom.xml

我的应用程序需要与SharePoint的一个Web服务集成。此Web服务无法自由访问,需要身份验证。

因此,我的应用程序中的标准wsdl2java Maven插件在执行generate-sources阶段时会出现HTTP 401错误。

有没有办法设置Maven / POM,以便我可以提供生成存根的用户/密码?

我遇到了一些答案,说这是不可能的,但所有答案都超过1年。我还没有发现Maven是否已发布此更新。一种选择是保存WSDL的本地副本(如建议的here),但我希望避免使用本地副本。

4 个答案:

答案 0 :(得分:8)

因为你提到过CXF,所以我想你的意思是cxf-codegen-plugin。这有点像黑客但它有效。

可以使用java.net.Authenticator提供HTTP身份验证凭据。需要定义自己的Authenticator类,它覆盖getPasswordAuthentication(..)方法。然后必须将其设置为默认身份验证器。据我所知,它不能以声明方式(例如使用环境属性)以编程方式使用Authenticator.setDefault(..)。

为了调用Authenticator.setDefault(..),我会使用CXF扩展机制。使用类似的类创建单独的maven项目:

public class AuthenticatorReplacer {

    public AuthenticatorReplacer(Bus bus) {
        java.net.Authenticator.setDefault(new java.net.Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("test", "test123"
                        .toCharArray());
            }
        });
    }

}

和文件src \ main \ resources \ META-INF \ cxf \ bus-extensions.txt,内容为:

org.example.AuthenticatorReplacer::false

然后将新创建的项目添加为cxf-codegen-plugin的依赖项:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${project.version}</version>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cxf-authenticator-replacer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    ...
</plugin>

这样,AuthenticatorReplacer由CXF扩展机制初始化,并用我们的默认Authenticator替换。

答案 1 :(得分:1)

@Dawid Pytel解决方案的一个干净的替代方案是在wsdl类自动生成的生命周期中运行此类:

<plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.4.0</version>
      <executions>
        <execution>
          <phase>generate-sources</phase>
          <goals>
            <goal>java</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <mainClass>path.to.AuthenticatorReplacer</mainClass>
      </configuration>
    </plugin>

重要提示:您的AuthenticatorReplacer必须是main(String[] args)类并在其中运行代码。

答案 2 :(得分:0)

我确认了Dawid的解决方案有效。或者,您可以使用SoapUI下拉并缓存wsdl,然后使用SoapUi代码生成支持来使用cxf生成代码。

http://java.dzone.com/tips/generating-client-java-code

答案 3 :(得分:-1)

Dawid的解决方案也适用于我。虽然这有点棘手。在Eclipse中,pom.xml一直在抱怨“wsdl2java失败:无法加载扩展类AuthenticatorReplacer”。您必须忽略此错误消息并使用命令行:

  

mvn generate-sources

然后将成功生成Java类。