2012-11-12 27 views
8

Ho un'applicazione che deve essere integrata con uno dei servizi Web di SharePoint. Non è possibile accedere liberamente a questo servizio Web e richiede l'autenticazione.Configurare Maven per utilizzare CXF wsdl2java con l'autenticazione di base

Come tale, il plugin standard wsdl2java Maven nella mia applicazione fornisce un errore HTTP 401 quando viene eseguita la fase generate-sources.

C'è un modo per configurare Maven/POM in modo che possa fornire un utente/password che genererà gli stub?

Mi sono imbattuto in alcune risposte dicendo che questo non è possibile ma tutte le risposte sono più vecchie di 1 anno. Non ho trovato se Maven abbia pubblicato un aggiornamento su questo. Un'opzione è di salvare una copia locale del WSDL (come suggerito here) ma vorrei evitare di avere copie locali.

risposta

8

Perché hai citato CXF, suppongo che tu intenda il plugin cxf-codegen. È un po 'un trucco, ma funziona.

Le credenziali di autenticazione HTTP possono essere fornite utilizzando java.net.Authenticator. È sufficiente definire la propria classe Authenticator che sovrascrive il metodo getPasswordAuthentication (..). Quindi deve essere impostato come Autenticato predefinito. Per quanto ne so, non può essere fatto in modo dichiarativo (ad esempio usando le proprietà dell'ambiente) solo in modo programmatico usando Authenticator.setDefault (..).

Per chiamare Authenticator.setDefault (..) vorrei utilizzare il meccanismo di estensione CXF. Crea progetto separato Maven con classe simile:

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()); 
      } 
     }); 
    } 

} 

e file src \ principali risorse \ \ META-INF \ CXF \ bus-extensions.txt con contenuti:

org.example.AuthenticatorReplacer::false 

Quindi aggiungere progetto appena creato come una dipendenza a 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> 

In questo modo AuthenticatorReplacer viene inizializzata dal meccanismo di estensione CXF e sostituisce Authenticator di default con la nostra.

+0

Mi hai salvato la vita oggi. Sarebbe bello se qualcuno potesse scoprire come ottenere lo stesso senza un "hack", ma hey funziona., – membersound

0

Ho verificato che la soluzione di Dawid funziona. In alternativa, è possibile utilizzare SoapUI per estrarre e memorizzare nella cache il wsdl e quindi utilizzare il supporto per la generazione del codice SoapUi per utilizzare cxf per generare il codice.

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

-1

soluzione di Dawid funziona anche per me. È un po 'complicato però. In Eclipse, pom.xml continua a lamentarsi del fatto che "wsdl2java non è riuscito: impossibile caricare la classe di estensione AuthenticatorReplacer". Bisogna ignorare questo messaggio di errore e utilizzare la riga di comando:

MVN generare sorgenti

Le classi Java verranno quindi generati con successo.

+0

Benvenuti nel sito. I commenti devono essere pubblicati come tali, non come risposta. Sentiti libero di fare una domanda separata se hai bisogno di risolvere un problema diverso. Vedi: [ Centro assistenza> Risposta Perché e in che modo vengono eliminate alcune risposte?] (Http://stackoverflow.com/help/deleted-answers). – mins

+0

Benvenuti nel sito. I commenti devono essere pubblicati come tali, non come risposta. Sentiti libero di fare una domanda separata se hai bisogno di risolvere un problema diverso. Vedi: [Perché e come vengono cancellate alcune risposte?] (Http://stackoverflow.com/help/deleted-answers). – mins

2

Un'alternativa pulita per la soluzione di @Dawid Pytel potrebbe essere quella di eseguire questa classe durante l'intero ciclo di vita della produzione di auto di classe 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> 

Importante: la vostra AuthenticatorReplacer deve essere una classe main(String[] args) e l'esecuzione del codice all'interno.

Problemi correlati