0

我正在使用 EJB 3.1 和球衣作为 restapi。我想要一个SuperResource如下,然后由下面的实际剩余资源继承。我现在拥有它的方式,我的@EJB对象是空的。有谁知道如何解决这一问题?

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


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

@Stateless我已经尝试了and@LocalSuperResourceand之间的整个真值表MyResource。这些排列似乎都不起作用。

我不知道这是否重要,我的服务器是 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(...);
  }
}
4

2 回答 2

0

MyResource也必须是一个 EJB bean,通过注释它@Stateless

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

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

于 2012-10-07T21:33:48.127 回答
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();
            }
        }
于 2012-10-15T09:29:13.277 回答