Saltar al contenido

¿Cuál es el mejor complemento de maven para generar un cliente de servicio web?

Solución:

Tengo que generar un cliente WS y no puedo decidir qué complemento usar. Hasta ahora mis opciones son: jaxb2-maven-plugin, axistools-maven-plugin y jaxws-maven-plugin.

Primero el jaxb2-maven-plugin no está realmente destinado a generar clientes de WS. ELIMINADO.

En segundo lugar, personalmente no usaría Axis ni siquiera para el desarrollo de clientes, por lo que no recomendaría usar el axistools-maven-plugin. ELIMINADO.

Esto nos deja con las pilas JAX-WS RI y Apache CXF, y sus respectivos complementos de Maven: el complemento JAX-WS Maven (las instrucciones para usar el complemento JAX-WS Maven se pueden encontrar en la página de uso) y el cxf-codegen -enchufar.

Respecto a los pros y contras, los resumiría así:

  • JAX-WS RI está incluido en Java 6, pero la documentación es más “aproximada” (aunque también encontrará muchos tutoriales sobre JAX-WS RI).
  • Apache CXF está mejor documentado y proporciona más flexibilidad si desea ir más allá de las especificaciones.

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

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

Generando código del lado del cliente a partir del archivo 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 bean de servicio del cliente (esto no se genera automáticamente):

public interface InternalReportsAPIServiceFactory {

    public InternalReportsAPIService createInternalReportsAPIService();

}

Su implementación de Bean:

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 (usado como Spring bean) es tener un singleton para generar un código de servicio al cliente. Requiere dos entradas: La URL de WSDL, es decir, la URL real del servidor que implementa WSDL. El código de servicio del cliente, después 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 con la versión correcta del servidor. Entonces, coloqué la URL en un archivo de propiedades accesible para mi aplicación, por lo que inicializo en mi archivo de contexto de la aplicación Spring.

Aquí hay un ejemplo de cómo usar la fábrica para generar un servicio y luego usarlo:

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

Desde aquí, simplemente use la variable de puerto para llamar a cualquier operación disponible en wsdl.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *