多态EJB客户端

时间:2012-10-07 21:13:04

标签: java java-ee ejb-3.1

我正在使用EJB 3.1和jersey进行restapi。我希望有一个SuperResource,如下所示,然后由实际的其余资源继承,如下所示。我现在拥有它的方式,我的@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(...);
  }
}

2 个答案:

答案 0 :(得分:0)

MyResource也必须是一个EJB bean,用@Stateless注释:

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

如果您只需要注入DAO,则可以选择使用CDI将JAX-RS资源注入该DAO。如果你的资源 - 成为无状态bean,那么你需要注意某些后果(比如为每个方法启动的事务,除非你明确禁用它等)。

答案 1 :(得分:0)

看起来像EJB注入问题。根据服务器,您需要使用mappedName / name / 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();
            }
        }