2017-05-24 1 views
0

Tout en essayant de migrer une application de JBoss EAP 5 à JBoss EAP ainsi que d'ajouter des fonctionnalités supplémentaires telles que JAX-RS je reçois l'erreur suivante:JBoss EAP 7, Exception Weld seulement @Dependent est autorisé

WELD-000082: L'interface d'étendue javax.enterprise.context.RequestScoped n'est pas autorisée sur les beans de session sans état pour la classe net.MyCompany.My.service.MyIPAuthJaxRsService. Seul @Dependent est autorisé.

La trace complète de la pile:

1:02:29,721 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."C1Authentication.ear".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."C1Authentication.ear".WeldStartService: Failed to start service 
     at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
    Caused by: org.jboss.weld.exceptions.DefinitionException: WELD-000082: Scope interface javax.enterprise.context.RequestScoped is not allowed on stateless session beans for class net.MyCompany.My.service.MyIPAuthJaxRsService. Only @Dependent is allowed. 
     at org.jboss.weld.bean.SessionBean.checkScopeAllowed(SessionBean.java:122) 
     at org.jboss.weld.bean.SessionBean.internalInitialize(SessionBean.java:101) 
     at org.jboss.weld.bean.RIBean.initialize(RIBean.java:69) 
     at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$5.doWork(ConcurrentBeanDeployer.java:121) 
     at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$5.doWork(ConcurrentBeanDeployer.java:118) 
     at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) 
     at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
     at org.jboss.threads.JBossThread.run(JBossThread.java:320)

Dans Eclipse, les projets sont à facettes 3.2 EJB et Java 1.7

Mon fichier EJB-jar.XML contient:

<?xml version="1.0" encoding="UTF-8"?> 
    <ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" version="3.2"> 
     <display-name>C1AuthService</display-name> 
     <enterprise-beans> 
      <session> 
       <ejb-name>MyWSService</ejb-name> 
       <ejb-class>net.MyCompany.My.service.MyWSService</ejb-class> 
       <session-type>Stateless</session-type> 
       <transaction-type>Container</transaction-type> 
      </session> 
      <session> 
       <ejb-name>MyIPAuthJaxRsService</ejb-name> 
       <ejb-class>net.MyCompany.My.service.MyIPAuthJaxRsService</ejb-class> 
       <session-type>Stateless</session-type> 
       <transaction-type>Container</transaction-type> 
      </session> 
      <session> 
       <ejb-name>MyIPAuthJaxRsServiceApplication</ejb-name> 
       <ejb-class>net.MyCompany.My.service.MyIPAuthJaxRsServiceApplication</ejb-class> 
       <session-type>Stateless</session-type> 
       <transaction-type>Container</transaction-type> 
      </session> 
     </enterprise-beans> 
    </ejb-jar>

Les deux classes JAX-RS sont:

package net.mycompany.my.service; 

    import javax.ws.rs.ApplicationPath; 
    import javax.ws.rs.core.Application; 
    import java.util.HashSet; 
    import java.util.Set; 

    @ApplicationPath(value="/C1AuthService") 
    public class MyIPAuthJaxRsServiceApplication extends Application { 

     private Set singletons = new HashSet(); 

     public MyIPAuthJaxRsServiceApplication() { 
      singletons.add(new MyIPAuthJaxRsService()); 
     } 

     @Override 
     public Set getSingletons() { 
      return singletons; 
     } 

     @Override 
     public Set> getClasses() { 
      // TODO Auto-generated method stub 
      return null; 
     } 
    }
package net.mycompany.my.service; 

    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 

    @Path("/C1AuthService") 
    public class MyIPAuthJaxRsService { 
     public MyIPAuthJaxRsService() { 
     } 

     @GET 
     @Path("/test") 
     public String test() { 
      return "Hello RESTFul 2"; 
     } 

    }

Répondre

0

Il se trouve après une recherche sur le web un peu, je trouve l'article suivant qui a fourni un indice: https://dzone.com/articles/valid-cdi-scopes-session-ejb

je suis tombé aussi sur ceci: http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/CDI.html

Ce qui semble J'ai été déclaré EJB-Jar.xml Je déclarais que les EJB étaient des beans de session sans état et en ne les annotant pas dans les classes java elles-mêmes le CDI/Weld était defaulti les considérer comme étant @Dependent, par ex. de l'article JBoss A CDI bean that does not explicitly define a scope is @Dependent scoped by default.

ajoutant simplement les importations et les annotations suivantes aux deux classes:

package net.mycompany.my.service; 

    import javax.ejb.Stateless; 
    import javax.ws.rs.ApplicationPath; 
    import javax.ws.rs.core.Application; 
    import java.util.HashSet; 
    import java.util.Set; 

    @Stateless 
    @ApplicationPath(value="/C1AuthService") 
    public class MyIPAuthJaxRsServiceApplication extends Application { 

     private Set singletons = new HashSet(); 

     public MyIPAuthJaxRsServiceApplication() { 
      singletons.add(new MyIPAuthJaxRsService()); 
     } 

    }
package net.mycompany.my.service; 

    import javax.ejb.Stateless; 
    import javax.ws.rs.GET; 
    import javax.ws.rs.Path; 

    @Stateless 
    @Path("/C1AuthService") 
    public class MyIPAuthJaxRsService { 
     public MyIPAuthJaxRsService() { 
     } 

     @GET 
     @Path("/test") 
     public String test() { 
      return "Hello RESTFul 2"; 
     } 

    }

vérifier Fondamentalement que vous avez annoté vos EJBs' avec @Stateless et a également ajouté la bonne importation import javax.ejb.Stateless;

Modifier - comme @SteveC a souligné que j'ai supprimé les remplacements mais quand j'ai essayé de supprimer le @Stateless de MyIPAuthJaxRsS erviceApplication comme il a suggéré j'ai fini par obtenir l'exception encore pour MyIPAuthJaxRsServiceApplication. Notez également que cet exemple ne fonctionne même pas et que les EJB dans EJB-Jar.xml ne sont pas forcément nécessaires, j'essayais d'utiliser un projet EJB et un jar dans un EAR, annotant les EJB avec JAX-RS, mais apparemment ce ne est pas pris en charge que je travaille avec les gars JBoss sur le sujet ici https://developer.jboss.org/message/972433#972433

on dirait que vous devez avoir un conteneur de servlet pour JAX-RS et le fait que EJB peut avoir des annotations de service Web doesn Cela ne veut pas dire qu'ils utilisent un conteneur de servlet - eh bien j'ai essayé! En outre, ce Q & A était plus pour fixer le A CDI bean that does not explicitly define a scope is @Dependent scoped by default. que j'ai lutté avec un peu et pensé que j'aiderais d'autres s'ils rencontrent la même chose.

+0

Votre classe 'MyIPAuthJaxRsServiceApplication' n'a pas besoin de' @ Stateless' et n'a probablement pas besoin de surcharger les méthodes. –

+0

Merci @SteveC pour l'entrée!J'essaierai de nouveau sans le @Stateless J'obtiendrais certainement l'erreur '@Dependent is allowed' pour la classe, mais je suppose que j'en avais besoin pour les deux fois que j'ai pensé à l'ajouter à la classe! ** mise à jour, maintenant je reçois l'exception pour cette classe ainsi il semble que c'est nécessaire ** Et merci de l'avoir signalé sur les remplacements - enlevé. En éditant le post, n'hésitez pas à vérifier l'édition car il y a une note! – JGlass