2011-06-07 18 views
7

Me gustaría integrar CXF con Google Guice. Ya estoy usando Guice en mi proyecto y quiero evitar añadir dependencias adicionales.CXF y Google Guice usando JAX-RS + JAX-WS

CXF fue mi elección porque uno de los requisitos es poder proporcionar interfaces XML, JSON, JSONP y SOAP a los usuarios de los servicios sin tener código duplicado (en este momento tenemos clases específicas de SOAP, para XML nos use Struts y para JSON escribimos nuestros propios analizadores, lo sé, me siento sucio también).

De todos modos, afaik, CXF puede cumplir este requisito, por lo que parece que estoy atascado con CXF.

¿Alguna idea o sugerencia sobre cómo integrar Guice con CXF? Pensé en extender la clase CXFNonSpringJaxrsServlet y hackear a Guice, pero de alguna manera parece que estaría haciendo algo que alguien más ya ha hecho.

Respuesta

4

Con CXF 2.4.x, CXF ya no se utiliza para configurar la primavera internamente en sí. Por lo tanto, puedes hacer casi cualquier cosa sin Spring.

Las partes de configuración son sin duda un problema. Sin embargo, todas las cosas de configuración de primavera son solo envoltorios delgados sobre las API de CXF. Por lo tanto, puede configurar prácticamente todo a través de las API. Puede que necesite cavar un poco más.

A modo de ejemplo, con CXF 2.4, que ahora han comenzado a apoyar el uso de Blueprint en lugar de primavera en OSGi. El soporte de blueprint no requiere ninguna de las cosas de Spring, pero se modela a partir de él.

+0

es posible, usted tiene razón ... CXF es lo suficientemente configurable (de interceptores a invocadores a las fábricas de autobuses) que se puede cablear en Guice. Los systests y los testcases ofrecen muchos ejemplos de esto. – chahuistle

1

Tienes un problema. CXF es completamente dependiente de Spring, debido a que está configurado internamente por Spring y al uso extensivo de las instalaciones de Spring. Como tal, no creo que es práctico tratar de CXF premio de la primavera sólo para que pueda utilizar en su lugar Guice; en mínimo, tendría que replicar toda la configuración con proveedores de Guice personalizados y aún así no funcionará (algunas partes de CXF utilizan parte de la capa Web de Spring).

Puede intentar usar el estilo JavaConfig de Spring para su código. Eso es en su mayoría similar al tipo de cosas que hace Guice (por lo que puedo ver). O supongo que podrías intentar usar dos marcos DI separados en la misma aplicación ... aunque eso me parece una oportunidad para un fracaso "hilarante".

3

Esto es lo que he estado usando (cxf-2.5.0).

@Singleton 
public class WebServiceServlet extends CXFNonSpringServlet { 
    private static final long serialVersionUID = 1L; 
    private final SamaService samaService; 

    @Inject 
    public WebServiceServlet(SamaService samaService) { 
     this.samaService = samaService; 
    } 

    @Override 
    protected void loadBus(ServletConfig sc) { 
     super.loadBus(sc); 
     BusFactory.setDefaultBus(getBus()); 
     Endpoint.publish("/Data.asmx", samaService); 
    } 
} 
+0

Hice un servlet similar, pero usé el inyector dentro de loadBus() en lugar de inyectar el servicio. El código se publica aquí: http://code.google.com/p/guice-cxf/issues/detail?id=1 – BrunoJCM

+0

¿Por qué la línea 'BusFactory.setDefaultBus (getBus())'? No parece necesario en tu ejemplo, funciona bien sin / –

Cuestiones relacionadas