2017-01-06 1 views
1

Je reçois une exception lors de la création d'un service Web CXF simple avec OSGI et Karaf.OSGI: exception CXF avec Karaf JAX-RS: aucune ressource n'a été trouvée pour la ressource

Apprécierait vraiment tous les commentaires/suggestions pour corriger.

Voici la description de mon projet et les étapes que je suivais:

  1. Téléchargé Apache Karaf-4.0.7
  2. Exécutez le « mvn clean install » dans la ligne de commande avec le chemin de mon projet
  3. route console Karaf, et exécuter les commandes suivantes

     feature:repo-add cxf 3.1.8 
         feature:install cxf/3.1.8 
    

Interface:

public interface MyRestService { 
     String pingMe(String echo); 
    } 

mise en œuvre:

@Path("/") 
public class MyRestServiceImpl implements MyRestService { 

    @GET 
    @Path("/{echo}") 
    @Produces(MediaType.APPLICATION_XML) 
    public String pingMe(@PathParam("echo") String echo) { 
     return "Knock Knock: " + echo + " !!"; 
    } 
} 

OSGI blueprint.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 
    xmlns:cxf="http://cxf.apache.org/blueprint/core" xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs" 
    xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws" 
    xsi:schemaLocation=" 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
     http://www.osgi.org/xmlns/blueprint-ext/v1.1.0 https://svn.apache.org/repos/asf/aries/tags/blueprint-0.3.1/blueprint-core/src/main/resources/org/apache/aries/blueprint/ext/blueprint-ext.xsd 
     http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd 
     http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd 
     http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd 
     http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd 
     http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd 
    "> 
    <cxf:bus id=”myBusId”> 
     <cxf:features> 
      <cxf:logging></cxf:logging> 
     </cxf:features> 
    </cxf:bus> 

    <jaxrs:server id="myRestService" address="/RestProject/SimpleRestCall"> 
     <jaxrs:serviceBeans> 
      <ref component-id="myRestImpl" /> 
     </jaxrs:serviceBeans> 
    </jaxrs:server> 

    <bean id="myRestImpl" class="com.rest.api.impl.MyRestServiceImpl" /> 
</blueprint> 

Features.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" 
    name="restAPI"> 

    <repository>mvn:org.apache.cxf.karaf/apache-cxf/3.1.8/xml/features</repository> 

    <feature name="test" description="simple test" version="1.0.0-SNAPSHOT"> 
     <details>A Rest server</details> 

     <!-- CXF and depdendencies --> 
     <feature version="3.1.8">cxf-jaxrs</feature> 

     <!-- Jackson and dependencies --> 
     <bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jsr339-api-2.0/2.6.0</bundle> 
     <bundle>mvn:com.github.fge/jackson-coreutils/1.8</bundle> 
     <bundle>mvn:com.fasterxml.jackson.core/jackson-core/2.7.4</bundle> 
     <bundle>mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-base/2.7.4</bundle> 
     <bundle>mvn:com.fasterxml.jackson.core/jackson-annotations/2.7.4</bundle> 
     <bundle>mvn:com.fasterxml.jackson.core/jackson-databind/2.7.4</bundle> 
     <bundle>mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/2.7.4</bundle> 
     <bundle>mvn:com.github.fge/msg-simple/1.1</bundle> 
     <bundle>mvn:com.google.guava/guava/16.0.1</bundle> 
     <bundle>mvn:com.github.fge/btf/1.2</bundle> 
     <bundle>wrap:mvn:com.google.code.findbugs/jsr305/2.0.1</bundle> 

     <!-- The myRest Server --> 
     <bundle>mvn:com.rest.ebb.test/myRest/1.0.0-SNAPSHOT</bundle> 

    </feature> 

</features> 

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.rest.ebb.test</groupId> 
     <artifactId>myRest-parent</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
    </parent> 

    <groupId>com.rest.ebb.test</groupId> 
    <artifactId>myRest</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 

    <packaging>bundle</packaging> 
    <name>MyRestServer</name> 
    <description>A server for test</description> 
    <url>.example.com</url> 
    <properties> 
    <cxf.version>3.1.8</cxf.version> 
    <skipTests>true</skipTests> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <version>2.4.0</version> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-Activator>com.ebb.rest.Activator</Bundle-Activator> 
         <Embed-Dependency>!org.osgi.core,*</Embed-Dependency> 
         <Embed-Transitive>true</Embed-Transitive> 
         <Import-Package> 
          !com.google.protobuf,!com.google.protobuf.*, 
          !com.jcraft.*, 
          !com.ning.*, 
          !groovy.lang, 
          !javassist, 
          !lzma.*, 
          !net.jpountz.*, 
          !org.apache.*, 
          !org.bouncycastle.*, 
          !org.codehaus.*, 
          !org.eclipse.*, 
          !org.jboss.*, 
          !rx, 
          !sun.security.*, 
          !net.bytebuddy.*, 
          !org.HdrHistogram, 
          !org.slf4j.event, 
          !org.xerial.*, 
          !sun.reflect, 
          !sun.misc, 
          !sun.util.calendar, 
          !com.sun.jdi.*, 
          !jersey.repackaged.com.google.common.*, 
          !javax.servlet, 
          * 
         </Import-Package> 
        </instructions> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.osgi</groupId> 
      <artifactId>org.osgi.core</artifactId> 
      <version>5.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>2.24</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-grizzly2-http</artifactId> 
      <version>2.24</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>19.0</version> 
      <type>bundle</type> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>2.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.inject</groupId> 
      <artifactId>guice</artifactId> 
      <version>4.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.inject.extensions</groupId> 
      <artifactId>guice-multibindings</artifactId> 
      <version>4.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.datastax.cassandra</groupId> 
      <artifactId>cassandra-driver-core</artifactId> 
      <version>3.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.threeten</groupId> 
      <artifactId>threetenbp</artifactId> 
      <version>1.3.2</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.8.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.opencsv</groupId> 
      <artifactId>opencsv</artifactId> 
      <version>3.7</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>1.7.21</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.5.2</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
     </dependency> 
     <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>jsr311-api</artifactId> 
     <version>1.1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxrs</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http-jetty</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    </dependencies> 
</project> 

Erreurs:

Je ne suis pas en mesure de déployer des faisceaux OSGi dans Karaf et obtenir les erreurs suivantes:

2017-01-06 11:00:39,340 | WARN | pool-9-thread-1 | ResourceUtils     | 141 - org.apache.cxf.cxf-rt-frontend-jaxrs - 3.1.8 | No resource methods have been found for reso 
class com.rest.api.impl.MyRestServiceImpl 
2017-01-06 11:00:39,373 | ERROR | pool-9-thread-1 | AbstractJAXRSFactoryBean   | 141 - org.apache.cxf.cxf-rt-frontend-jaxrs - 3.1.8 | No resource classes found 
2017-01-06 11:00:39,375 | WARN | pool-9-thread-1 | BeanRecipe      | 33 - org.apache.aries.blueprint.core - 1.6.2 | Object to be destroyed is not an instance of Unwra 
edBeanHolder, type: null 
2017-01-06 11:00:39,385 | ERROR | pool-9-thread-1 | BlueprintContainerImpl   | 33 - org.apache.aries.blueprint.core - 1.6.2 | Unable to start blueprint container for bundle mvn:com.abb.ecc.my/myRest/1.0.0-SNAPSHOT 
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to initialize bean myRestService 
     at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:738)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:848)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:811)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[33:org.apache.aries.blueprint.core:1.6.2] 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_51] 
     at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:255)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:186)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:724)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:411)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:276)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:300)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:269)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:265)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:255)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)[43:org.apache.aries.util:1.1.1] 
     at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)[43:org.apache.aries.util:1.1.1] 
     at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)[43:org.apache.aries.util:1.1.1] 
     at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)[43:org.apache.aries.util:1.1.1] 
     at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)[43:org.apache.aries.util:1.1.1] 
     at org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1179)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:731)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:486)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4541)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:2172)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)[org.apache.felix.framework-5.4.0.jar:] 
     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1286)[10:org.apache.karaf.features.core:4.0.7] 
     at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:846)[10:org.apache.karaf.features.core:4.0.7] 
     at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1176)[10:org.apache.karaf.features.core:4.0.7] 
     at org.apache.karaf.features.internal.service.FeaturesServiceImpl$1.call(FeaturesServiceImpl.java:1074)[10:org.apache.karaf.features.core:4.0.7] 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_51] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_51] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_51] 
     at java.lang.Thread.run(Thread.java:745)[:1.8.0_51] 
Caused by: org.apache.cxf.service.factory.ServiceConstructionException 
     at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:219) 
     at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.init(JAXRSServerFactoryBean.java:142) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_51] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_51] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_51] 
     at java.lang.reflect.Method.invoke(Method.java:497)[:1.8.0_51] 
     at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:299)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:980)[33:org.apache.aries.blueprint.core:1.6.2] 
     at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:736)[33:org.apache.aries.blueprint.core:1.6.2] 
     ... 34 more 
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: No resource classes found 
     at org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean.checkResources(AbstractJAXRSFactoryBean.java:317) 
     at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:159) 
     ... 42 more 
+0

Pouvez-vous essayer de ne pas Pour utiliser l'interface, faites simplement votre implémentation et votre annotation REST sur la classe 'MyRestServiceImpl'; Nous avons eu quelques problèmes avec interfcaes dans le passé et maintenant tous nos services REST sont définis dans les classes seulement. –

Répondre

0

Essayez de mettre les annotations JAX-RS sur l'interface de service.

Une autre cause possible est que le package d'annotations n'est pas importé. Vous bloquez beaucoup d'importations dans votre pom. Pouvez-vous vérifier sans ces définitions.

+0

J'ai essayé de cette façon aussi mais je n'ai pas beaucoup aidé. J'ai la même erreur. Merci @ Christian Schneider. – Sarav

+0

@Sarav Quelle annotation avez-vous mis dans l'interface? Il semble que JAX-RS soit assez sensible sur lequel vous le déclarez. –

+0

@ruffp les annotations en utilisant Am JAX-RS suivantes dans l'interface: – Sarav

0

De mon côté vos œuvres de code, mais je devais changer les choses suivantes:

  1. Retirez le CxF: bus du plan
  2. Retirez le @Path sur la classe d'implémentation
  3. Modifier la section d'importation dans le pom.xml

Mise en œuvre:

package com.mycompany.testcxf; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

public class MyRestServiceImpl implements MyRestService { 

    @Override 
    @GET 
    @Path("/{echo}") 
    @Produces(MediaType.APPLICATION_XML) 
    public String pingMe(@PathParam("echo") String echo) { 
     return "Knock Knock: " + echo + " !!"; 
    } 
} 

pom.xml:

<osgi.export.package>{local-packages}</osgi.export.package> 
<osgi.import.package> 
    com.mycompany.testcxf*, 
    * 
</osgi.import.package> 

et je n'importer la dépendance:

<dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxrs</artifactId> 
     <version>2.7.13</version> 
    </dependency> 

Remarque Je ne peux pas tester la version 3 CXF que vous parce que mon conteneur OSGI est lié à cette version. Cependant, cette configuration fonctionne parfaitement pour moi, alors cela pourrait être un problème avec la version CXF et certaines incompatibilités avec le serveur http intégré (Jetty?).

Ma configuration est ServiceMix 5.1.4 avec:

  • version 2.3.9 d'Apache Karaf
  • Version 2.13.3 de Camel
  • Version 2.7.13 de CXF
+0

J'ai essayé la façon dont vous l'avez suggéré, mais il jette une autre erreur en disant: org.osgi.service.blueprint.container.ComponentDefinitionException: ref élément doit avoir un attribut de composant-carte d'identité valide Merci @ruffp. – Sarav

+0

@sarav J'ai mis à jour ma réponse et cela fonctionne avec ma configuration. Pouvez-vous essayer avec CXF v3 un laissez-moi savoir? –