2017-05-24 61 views
0

雖然試圖從遷移的JBoss EAP 5到JBoss EAP的應用程序,以及添加一些額外的功能,如JAX-RS,我發現了以下錯誤:的JBoss EAP 7,焊接異常@Dependent只允許

WELD-000082:範圍接口javax.enterprise.context.RequestScoped是不允許的無狀態會話bean類net.MyCompany.My.service.MyIPAuthJaxRsService。只允許@Dependent。

完整的堆棧跟蹤:

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)

在Eclipse中,項目方面處於EJB 3.2和Java 1.7

我的ejb-jar.xml文件包含:

<?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>

的兩個JAX-RS類是:

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"; 
     } 

    }

回答

0

原來在網上搜索了一下,我發現下面的文章,其提供的線索後: https://dzone.com/articles/valid-cdi-scopes-session-ejb

我也是偶然發現了這一點: http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/CDI.html

什麼似乎已經發生的事情是在EJB-JAR.XML我被宣佈EJB的爲無狀態會話bean,並通過在Java類沒有註解它們自己的CDI /焊縫是defaulti將它們變成@依賴,例如從JBoss文章A CDI bean that does not explicitly define a scope is @Dependent scoped by default.

只需添加以下的進口和註釋兩類:

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"; 
     } 

    }

基本上檢查是否已標註的EJB組件與@Stateless,也加入適當的進口import javax.ejb.Stateless;

編輯 - 作爲@SteveC指出,我已經刪除了重寫,但是當我試圖刪除從MyIPAuthJaxRsS的@Stateless erviceApplication,他建議我最終再次獲得例外MyIPAuthJaxRsServiceApplication。另外值得注意的是,這個例子中甚至沒有工作,因此具有在EJB-jar.xml中的EJB的註解,並可能不會甚至是必要的,我試圖在EAR中使用的EJB項目和jar,註釋EJB的用JAX-RS,但因爲我與JBoss的傢伙就在這裏工作 https://developer.jboss.org/message/972433#972433

顯然它不支持看起來像你必須有對JAX-RS servlet容器和事實EJB的可以使用Web服務標註沒有按這並不意味着他們正在使用一個servlet容器 - 哦,我嘗試過!此外,這種問答&一個更固定,我掙扎了一下,想我會幫助別人,如果他們碰上同樣的事情A CDI bean that does not explicitly define a scope is @Dependent scoped by default.

+0

你'MyIPAuthJaxRsServiceApplication'類並不需要'@ Stateless',最有可能並不需要重寫任何方法。 –

+0

感謝@SteveC的輸入!我會在沒有@Stateless的情況下再試一次,我肯定會爲一個類獲得'@Dependent is allowed'錯誤,但只是假設我需要它,一旦我想將它添加到一個! **更新,現在我得到這個類的異常,所以它似乎是必需的**並感謝您指出,在覆蓋 - 刪除。編輯帖子,隨時檢查編輯,因爲有一個筆記! – JGlass