Quiero migrar mi aplicación EE a OSGi. mi aplicación consiste en bibliotecas comerciales, bases de datos JPA/Entidades y una interfaz REST/WS. también tiene un cliente web.OSGi JAX-RS y servicio declarativo Bnd
Empiezo creando un prototipo de la estructura y haciendo que todas las interfaces y paquetes se comuniquen entre sí en una forma limpia de OSGi. Quiero utilizar una especificación limpia tanto como sea posible sin ningún proveedor o marco específico.
Estoy usando el complemento bnd maven para generar el manifiesto y los servicios declarativos. Quiero hacer una llamada de mis recursos de descanso a un servicio OSGi (en otro paquete) mediante la inyección de este modo:
@Path("some-resources")
@Component
public class SomeResources{
private SomeService service = null;
@Reference
public void setController(SomeService service) { // <- this is never called
this.service = service;
}
@GET
@Produces(javax.ws.rs.core.MediaType.APPLICATION_XML)
public Object getSomeService() { // <- called
try {
service.process("Hello World"); // <- Error null object
}
...
}
¿Puedo anotar el recurso con BND @Component
y se la @Resource
inyectar? todo funciona bien, pero el servicio siempre es nulo.
¿Cuál debería ser la forma de declarar mi paquete para que BND lo convierta en un paquete web/wab?
utilizo paquete experto:
<packaging>bundle</packaging>
...
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<dependencies>
<dependency>
<groupId>biz.aQute</groupId>
<artifactId>bndlib</artifactId>
<version>1.50.0</version>
</dependency>
</dependencies>
<configuration>
<supportedProjectTypes>
<supportedProjectType>ejb</supportedProjectType>
<supportedProjectType>war</supportedProjectType>
<supportedProjectType>wab</supportedProjectType>
<supportedProjectType>bundle</supportedProjectType>
<supportedProjectType>jar</supportedProjectType>
</supportedProjectTypes>
<instructions>
<_include>-osgi.bundle</_include>
</instructions>
</configuration>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
<execution>
<id>bundle-install</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
...
con las instrucciones del BND
Web-ContextPath: my-root-http/rest/
Service-Component: *
Recientemente me encontré con un problema similar (servicio no consiguió obligado) y lo rastreó a la [paquete dividido] (http://wiki.osgi.org/wiki/ Split_Packages) problema. ¿Has intentado poner tu interfaz de servicio en un paquete separado? –
gracias @ BjörnPollex por la sugerencia. Tengo 3 paquetes, uno con interfaces solamente, uno con la implementación del servicio y el bundel REST. De hecho, lo moví de vuelta al bundel REST para ver si funcionaba, pero no tuve suerte. Si lo que estoy haciendo es correcto, quizás el problema esté en que el SCR no encuentre mi DS xml. – Gadi
gracias por editar @donalfellows – Gadi