2012-11-12 39 views
8

我有一個應用程序需要與SharePoint的一個Web服務集成。此Web服務無法自由訪問並需要身份驗證。將Maven配置爲使用帶基本身份驗證的CXF wsdl2java

因此,我的應用程序中的標準wsdl2java Maven插件在執行generate-sources階段時會給出HTTP 401錯誤。

有沒有辦法設置Maven/POM,以便我可以提供一個用戶/密碼來生成存根?

我遇到了一些答案,說這是不可能的,但所有的答案都超過1年。我還沒有發現Maven是否已經發布了這方面的更新。一種選擇是保存本地WSDL副本(如建議here),但我想避免擁有本地副本。

回答

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 \主\資源\ META-INF \ CXF \總線extensions.txt與內容:

org.example.AuthenticatorReplacer::false 

然後加入新創建的項目作爲依賴於CXF-CODEGEN-插件:

<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擴展機制初始化並取代默認的身份驗證與我們的。

+0

今天你救了我一命。這將是很好,如果任何人可以找到如何實現相同的沒有「黑客」,但嘿它的作品。, – membersound

-1

的Dawid的解決方案適用於我。雖然這有點棘手。在Eclipse中,pom.xml不斷抱怨「wsdl2java失敗:無法加載擴展類AuthenticatorReplacer」。你必須忽略此錯誤消息,並且使用命令行:

MVN產生來源

的Java類將被成功生成。

+0

歡迎來到該網站。評論應該如此發佈,而不是回答。如果您需要解決不同的問題,請隨時提出一個單獨的問題。請參閱:[ 幫助中心>回答 爲什麼以及如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 – mins

+0

歡迎來到本網站。評論應該如此發佈,而不是回答。如果您需要解決不同的問題,請隨時提出一個單獨的問題。請參閱:[爲什麼以及如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 – mins

2

的清潔替代@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)類和運行中的代碼。