2012-10-07 101 views
0

我正在使用EJB 3.1和jersey進行restapi。我想有一個如下的SuperResource,然後由下面的實際剩餘資源繼承。我現在的方式是,我的@EJB對象爲空。有誰知道如何解決這一問題?多態EJB客戶端

@Stateless 
public class SuperResource { 
    @EJB 
    protected GenericDao<DomainObject> dao; 
    . . . 
} 


public class MyResource extends SuperResource{  
    public String doGet(){ 
     return dao.get(...); 
    } 
} 

我試圖@Stateless@Local,並SuperResourceMyResource之間的整個真值表。這些排列似乎都不起作用。

我不知道這是很重要的,我的服務器是GlassFish 3.1.2

編輯補充細節:

我不這麼認爲,但似乎更多的細節可能需要在這裏:我的應用程序的

結構:

@Local 
public interface GenericDao<T extends DomainObject> {…} 

public interface LoginDao extends GenericDao<Login>{...} 

@Stateless 
public class GenericDaoImpl<T extends DomainObject> implements GenericDao<T> {…} 

@Stateless 
public class LoginDaoImpl extends GenericDaoImpl<Login> implements LoginDao {…} 

@Entity 
public class Login implements java.io.Serializable, DomainObject {…} 

什麼工作:

@Stateless 
@Path("mypath") 
public class MyResource{   
@EJB 
private LoginDao dao;  
    public String doGet(){ 
    return dao.get(...); 
    } 
} 
+1

將來自SuperResource的@Stateless註釋移至MyResource。 –

回答

0

MyResource必須是一個EJB豆以及通過與@Stateless註釋它:

@Stateless 
public class MyResource extends SuperResource{  
    public String doGet(){ 
     return dao.get(...); 
    } 
} 

如果你只需要注入的DAO,你可以選擇使用CDI是DAO注入你的JAX-RS資源代替。如果你的資源成爲一個無狀態bean,那麼你需要知道某些後果(比如每個方法都會啓動的事務,除非你明確地禁止了這些),等等。

+0

我已經編輯上面添加細節(不知道他們是否有必要)。我也在添加(作爲評論)我做了你所建議的事後得到的錯誤。 – kasavbere

+0

SEVERE:EJB5070:創建無狀態會話Bean的異常:[GenericDaoImpl] 警告:EJB5184:在調用EJB GenericDaoImpl期間發生系統異常,方法:public void ccv4.dao.impl.GenericDaoImpl.save(ccv4.domain.utils。 domainObject的) 警告:javax.ejb.EJBException異常:javax.ejb.EJBException異常:javax.ejb.CreateException:無法創建無狀態EJB \t在com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454) \t at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547) – kasavbere

+0

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899) \t at com.sun.ejb.containers .EJBLocalObjectInvocationHandler.invoke(EJBLocalObject InvocationHandler.java:212) \t at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89) – kasavbere

0

它看起來像EJB注入問題。根據服務器,你需要玩mappedName /名稱/ beanName

我可以確認的是,下面的代碼工作在JBoss 7.1.1。

 @Local 
     public interface HelloWorldLocal { 
      public String sayHello(); 
     } 

     @Stateless 
     public class HelloWorldBean implements HelloWorldLocal { 
      public String sayHello(){ 
       return "Hello.............................................................................."; 
      } 
     } 

     @Remote 
     public interface BaseRemote { 
      public String test(); 
     } 

     @Stateless 
     public class BaseBean implements BaseRemote{ 
      @EJB 
      HelloWorldLocal bean; 
      public String test() { 
       return "Base Bean"; 
      } 
     } 

     @Remote 
     public interface DerivedRemote { 
      String test(); 
     } 

     @Stateful 
     public class DerivedBean extends BaseBean implements DerivedRemote{ 
      public String test() { 
       return bean.sayHello(); 
      } 
     }