2010-08-27 31 views
22

Tengo que generar un WS Client y no puedo decidir qué plugin usar. Hasta ahora mis opciones son: jaxb2-maven-plugin, axistools-maven-plugin y jaxws-maven-plugin.¿Cuál es el mejor plugin de maven para generar un cliente de servicio web?

+0

aquí http://stackoverflow.com/questions/2432859/difference-of-maven-jaxb-plugins dice que maven-jaxb2-plugin se desarrolla y prefiere constantemente.¿Por qué no puedes usar maven-jaxb2-plugin? – despot

Respuesta

31

I have to generate a WS Client and I can't decide wich plugin to use. Until now my options are: jaxb2-maven-plugin, axistools-maven-plugin and jaxws-maven-plugin.

primer lugar, el jaxb2-maven-plugin no es realmente la intención de generar clientes WS. ELIMINADO

En segundo lugar, en lo personal I wouldn't use Axis even for client development only por lo que se no recomienda utilizar el axistools-maven-plugin. ELIMINADO

Esto nos deja con la JAX-WS RI y el Apache CXF pilas, y sus respectivos plugins de Maven: los JAX-WS Maven Plugin (instrucciones para utilizar el JAX-WS Maven Plugin se puede encontrar en la página Usage) y el cxf-codegen-plugin.

En cuanto a los pros y los contras, me gustaría resumir como esto:

Al final, ambas opciones son decentes, por lo que sugiero navegar un poco por los enlaces y hacer su propia opinión.

+1

[JAX-WS Maven Plugin] (https://jax-ws-commons.java.net/jaxws-maven-plugin/) cambio de enlace. – Dormouse

+0

Le sugiero que edite la respuesta para actualizar los enlaces. –

+0

¡No se preocupen chicos, lo tengo! – javajavajava

4

Uso jaxws-maven-plugin. En mi opinión, JAX-WS es la implementación estándar de facto para WS. Tiene código generado mucho mejor que AXIS, y es más fácil de configurar e implementar. Tiene soporte de Maven y Spring.

La generación de código de cliente a partir de archivos WSDL, en pom.xml:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>generate-reports-ws-code</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 

<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution -->       <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile> 
         <packageName>com.acme.reports.ws.api</packageName> 
         <wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory> 
         <wsdlFiles> 
          <wsdlFile>InternalReportsAPIService.wsdl</wsdlFile> 
         </wsdlFiles> 
         <verbose>true</verbose> 
         <sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Una interfaz para crear el grano de servicio al cliente (esto se genera no automático):

public interface InternalReportsAPIServiceFactory { 

    public InternalReportsAPIService createInternalReportsAPIService(); 

} 

Su frijol implementación:

public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory { 

    private URL acmeReportsWsdlURL; 

    private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService"); 

    @Override 
    public InternalReportsAPIService createInternalReportsAPIService() { 
     return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME); 
    } 

    public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) { 
     try { 
      this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl); 
     } catch (MalformedURLException ex) { 
      throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex); 
     } 
    } 
} 

La idea en este bean (utilizado como Spring Bean) es tener un singleton para gen erating un código de servicio al cliente. Requiere dos entradas: la url WSDL, es decir, la URL real del servidor que implementa el WSDL. El código de servicio al cliente, al momento de la construcción, envía una solicitud de obtención del WSDL en la URL proporcionada. Luego crea el WSDL basado en las anotaciones que residen en el código generado automáticamente, y lo compara. Creo que esto se hace para asegurarse de que se está ejecutando contra la versión correcta del servidor. Por lo tanto, coloqué el URL en un archivo de propiedades accesible para mi aplicación, por lo tanto, lo inicializo en mi archivo de contexto de la aplicación Spring.

He aquí un ejemplo del uso de la fábrica para generar un servicio y después de usarlo:

InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService(); 
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort(); 

A partir de aquí, sólo tiene que utilizar la variable de puerto para llamar a cualquier operación disponibles en el WSDL.

+1

ejemplos de trabajo son siempre agradables. –

+1

Agregado ahora. Espero que ayude –

+0

esto no funcionó para mí. puedes poner todos los aspectos de tu pom con respecto al wsgen y wsimport gracias. por cierto, se queja de 'Error original: no se pudieron transferir los metadatos org.jvnet.staxex: stax-ex/maven-metadata.xml de/a java.net (http://download.java.net/maven/1/): No hay conector disponible para acceder al repositorio java.net' –

Cuestiones relacionadas