8

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

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

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

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

4

4 回答 4

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。

于 2012-12-26T18:55:19.907 回答
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)类并在其中运行代码。

于 2015-11-04T12:49:18.490 回答
0

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

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

于 2014-08-13T15:28:33.937 回答
-1

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

mvn 生成源

然后将成功生成 Java 类。

于 2015-03-13T19:04:12.240 回答