2012-01-27 19 views
5

Comencé a aprender Apache CXF con Spring. En primer lugar, intenté crear un modelo simple de cliente/servidor.Apache CXF + Spring: generación de un cliente simple

El lado del servidor es: service.HelloWorld.java

@WebService 
public interface HelloWorld { 
    String sayHi(String text); 
} 

service.HelloWorldImpl.java

@WebService(endpointInterface = "service.HelloWorld") 
public class HelloWorldImpl implements HelloWorld { 
    public String sayHi(String text) { 
    return "Hello, " + text; 
    } 
} 

El lado del cliente es: client.Client.java public class Cliente {

public static void main(String[] args) { 
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"cxf-client-servlet.xml"}); 
      HelloWorld client = (HelloWorld) context.getBean("client"); 
      System.out.println(client.sayHi("Batman")); 
    } 
} 

cxf-cliente-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://cxf.apache.org/jaxws 
    http://cxf.apache.org/schema/jaxws.xsd"> 

<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/> 

<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
    <property name="serviceClass" value="service.HelloWorld"/> 
    <property name="address" value="http://localhost:8080/services/HelloWorld"/> 
</bean> 

El problema es: para hacer el trabajo del cliente que he tenido que añadir el servicio. HelloWorld (paquete + interfaz) para el proyecto de los clientes. He oído que antes de usar un servicio necesito generar un stub. Entonces es confuso para mi Entonces, ¿cuál es el enfoque correcto y cuál es la mejor práctica (puede ser que sea mejor utilizar algún enfoque de contrato o similar)? Más tarde, quiero agregar WS-Security, así que necesito un fondo fuerte =)

Gracias de antemano.

Respuesta

2

Si está haciendo un desarrollo de código WS primero, entonces está bien distribuir la interfaz y entregársela al cliente. Creo que @WebService no es necesario (?) En la interfaz (solo implementación), por lo que el cliente no tiene dependencias en esta anotación.

Incluso si está haciendo servicios web basados ​​en código, aún puede descargar el documento WSDL generado por Apache CXF y dárselo al cliente. Con este enfoque (que se considera más maduro, sin mencionar que se puede usar en diferentes plataformas como .NET), el cliente debe generar los stubs (usando la herramienta como wsdl2java). Este proceso esencialmente creará una interfaz de cliente muy similar automáticamente.

Esa es una de las razones por las cuales muchas personas prefieren el desarrollo por contrato: el mismo WSDL se usa para generar stubs del lado del cliente y la implementación de WS del lado del servidor. Esto limita el alcance de las incompatibilidades (accidentales).

+0

Gracias por la respuesta. ¿Cómo puede el servicio distribuir la interfaz? – Dmitry

+0

¿Entonces sugiere no usar JaxWsProxyFactoryBean? – Dmitry

+2

Se necesita la anotación @WebService - He comprobado =) – Dmitry

4

Se puede utilizar una configuración de resorte simple como esto por el lado del cliente -

<jaxws:client id="mywebServiceClient" 
    serviceClass="com.saurzcode.TestService" 
    address="http://saurzcode.com:8088/mockTestService"> 

    <jaxws:binding> 
     <soap:soapBinding version="1.2" mtomEnabled="true" /> 
    </jaxws:binding> 
</jaxws:client> 
<cxf:bus> 
    <cxf:outInterceptors> 
     <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" /> 
    </cxf:outInterceptors> 
</cxf:bus> 

ignorar el interceptor si no lo necesita.

Más detalles en este post.

+0

¿Cómo inyectar este cliente en un bean? –

+0

@MarcinErbel ¿Puede explicar qué es exactamente lo que está buscando? – schhajed

+0

Ok, acabo de tener problemas en mi repositorio de mvn. Pensé que inyectar Client dentro de bean es mucho más complicado. Nvm, pero gracias por una respuesta. –

Cuestiones relacionadas