ClassCastException con (OSGI integrado)/Lanzador externo

Estoy usando felix para esto. Para mi prueba, acabo de crear un simple HelloWorld.

Paquete 1

public interface HelloWorldService {
    public void sayHello(String name);
}

--------- impl ----------

Paquete 2

Activador de paquete

public class HelloWorldActivator implements BundleActivator {
private static BundleContext bc;

@Override
public void start(BundleContext bundleContext) throws Exception {
    bc = bundleContext;
    System.out.println(bc.getBundle().getHeaders().get(Constants.BUNDLE_NAME) + " starting...");
    HelloWorldService helloWorldService = new HelloWorldImpl();
    bc.registerService(HelloWorldService.class.getName(),helloWorldService,null);
    System.out.println("registered...");
}

@Override
public void stop(BundleContext bundleContext) throws Exception {
    System.out.println(bc.getBundle().getHeaders().get(Constants.BUNDLE_NAME) + " stopping...");
    bc = null;
}

}

La implementación ---

public class HelloWorldImpl implements HelloWorldService {

@Override

public void sayHello(String name) {
    System.out.println("Hello "+name);
}
}

Cuando uso un cliente, que también es un paquete OSGI, funciona bien. Con un cliente externo, que usa el servicio OSGI, obtengo ClassCastException. Algunas ideas ?

public class ExternalClient {
private static final String BUNDLE_DIRECTORY = System.getProperty("auto.deploy.dir");
private static final ExternalClient externalClient = new ExternalClient();
private static Framework framework;
private ExternalClient() {
    start();
}
public static void main(String[] args) throws Exception{
    //For Some reason ServiceTracker was not returning the service, nor was getServiceReference. 
    ServiceReference[] serviceReferences = framework.getBundleContext().getAllServiceReferences(HelloWorldService.class.getName(),null);
    for(ServiceReference serviceReference : serviceReferences) {
        System.out.println(framework.getBundleContext().getService(serviceReference));
    }
    HelloWorldService helloWorldService = (HelloWorldService)framework.getBundleContext().getService(serviceReferences[0]); // Gives CLassCastException saying java.lang.ClassCastException: com.test.helloworld.impl.HelloWorldImpl cannot be cast to com.test.helloworld.HelloWorldService

    helloWorldService.sayHello("Blah");
    Thread.sleep(Long.MAX_VALUE);
}

public void start() {
    try {
        ServiceLoader<FrameworkFactory> factoryServiceLoader = ServiceLoader.load(FrameworkFactory.class);
        FrameworkFactory frameworkFactory = factoryServiceLoader.iterator().next();
        Map config = new HashMap();
        config.putAll(System.getProperties());
        config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN);
        config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);

        config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "com.test.helloworld");
        framework = frameworkFactory.newFramework(config);
        framework.start();

        List<Bundle> bundleList = new ArrayList<Bundle>();

        BundleContext bundleContext = framework.getBundleContext();
        File[] bundleJars = new File(BUNDLE_DIRECTORY).listFiles();
        Arrays.sort(bundleJars);
        for (File bundleJar : bundleJars) {
            if(bundleJar.getName().endsWith(".jar")) {
                Bundle b = bundleContext.installBundle(bundleJar.toURI().toString());
                bundleList.add(b);
            }
        }

        // Start all installed bundles.
        for (Bundle bundle : bundleList) {
            if(!isFragment(bundle))
                bundle.start();
        }

    } catch (BundleException bundleException) {
        throw new RuntimeException(bundleException);
    }
}

private static boolean isFragment(Bundle bundle) {
    return bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null;
}
}

preguntado el 10 de septiembre de 12 a las 22:09

1 Respuestas

No importa, creo que tuve que tomarme un descanso. Me di cuenta, me había perdido la versión, al especificar el paquete

*config.put(Constantes.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "com.test.helloworld;version=\"1.0.0\"");*

Y el código de acceso:

public static void main(String[] args) throws Exception{
    ServiceTracker helloWorldTracker;
    helloWorldTracker = new ServiceTracker(framework.getBundleContext(),HelloWorldService.class.getName(),null);
    helloWorldTracker.open();
    HelloWorldService helloWorldService = (HelloWorldService)helloWorldTracker.waitForService(5000);
    helloWorldService.sayHello((String) framework.getBundleContext().getBundle().getHeaders().get(Constants.BUNDLE_NAME));
    Thread.sleep(Long.MAX_VALUE);
}

Respondido el 10 de Septiembre de 12 a las 23:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.